Aytaç Kalıncı – Perl Fonksiyonlar

Proses (İşlem-program ve komut işlem süreci) :

Perl çalışan ve diğer programların yönetimi için geniş bir fonksiyon yelpazesi sunar. Bunlar 4 grupta

incelenebilir.

1 – İlave proses başlatma

2 – Çalışan program veya bir başka prosesi durdurma

3 – Program veya proses icra kontrolü

4 – Program veya proses yönetme (önceki kategorilere girmeyen)

Proses Başlatma : Proses yaratma ile ilgili prosesler eval, system, fork, pipe, exec, syscall’dır.

Eval : Bir karakter stringi, icra edilebilir perl programı gibi davranır.

Formatı;

eval (string)

Örnek :

$yaz = “print (“Selam size !!! n”);”; eval ($yaz);

Çıktısı,

Selam size !!!

Eval’in kullandığı string bir karakter string sabit veya bir ifade(değeri karakter string olmalı)

olabilir. Örnekte string önce $yaz sonra eval ‘e geçirildi.

Eval’e geçirilen string

print (“Selam size !!!n”); stringidir.

Eval fonksiyonu $@ sistem değişkenini kullanır. Bu değişken, icra edilebilir karakter stringini içereni

belirler. $@ içeriği null stringidir ve hata anında ,hata mesajı , @$ içinde oluşur. $@ içeriğinde bir şey

yoksa icra tamamdır.

Örnek : eval örneği

#!/usr/local/bin/perl $deger = 1; eval (“print (“Merhaba!n”); $deger = 7;”); print (“$deger değeri: $degern”);

Çalışması: program.pl

Merhaba! $deger değeri: 7 eval önce print(“Merhaba!n”); sonra $deger = 7; icra eder. Örnek : eval fonksiyonu kullanarak tell fonksiyonu var mı, yok mu test eden program #!/usr/local/bin/perlopen (DOSYAM, “dosya1”) || die (“dosya1 açılamadı”);eval (“$basla = tell(DOSYAM);”);if ($@ eq “”) { print (“tell fonksiyonu tanımlı.n”);} else { print (“tell fonksiyonu tanımlı degil!n”); }

Çalışması: program.pl

tell fonksiyonu tanımlı.

Eval çok faydalı bir fonksiyondur. Küçük programlarda çok iyi kullanıma sahiptir.

Büyük programlarda ise onu dosyaya yazdırıp system ile icra etmek daha iyidir.

system Fonksiyonu :

Daha öncede görmüştük. system(Liste); fonksiyona geçirilen Liste’de ilk argüman icra edilecek program sonrakiler ise programa geçirilecekargümanlardır.

Örnek :

#!/usr/local/bin/perl@liste = (“echo”, “Perl Öğreniyorum!”);system(@liste);

Çalışması : program.pl

Perl Öğreniyorum!

System fonksiyonu ile program çalışırken çıktıda bazen karışıklık olabileceğini düşünerek bu problemin çözümü için $| sistem değişkeni set edilir. Her bir file için 1 tanımlanmalıdır.Bu tanım o dosya için buffer yok demektir. Böylece çıktılar sırayla olur.

select (STDOUT);

$| = 1; select (STDERR);

$| = 1; gibi..

fork Fonksiyonu :

Bu fonksiyon, programınızın iki kopyasını yaratır. Parent ve child proses bu kopyalar eş zamanlı çalışırlar.

Syntax: $prosesid_değişkeni = fork(); Fork, child prosese 0, parent prosese 0 olmayan değer döndürür. Bu 0 olmayan değer child prosesin proses ID’sidir. Bu değer sizin hangi prosesin child, hangi prosesin parent olduğunu ayırmanıza yarar. Örnek :$deger = fork();if ($deger == 0) { # Burası child process exit; # child proces sonu} else { # parent proses} Eğer fork çalışmazsa, dönüş değeri tanımlanmayan bir değerdir. Bu değer ilerde göreceğimiz defined fonksiyonuyla test edilebilir. fork fonksiyonu kullanırken dikkatli olunmalıdır. Mesela, her iki kopya da print ediliyorsa karışıklık olabilir, yine döngü kullanılıyorsa çok fazla kopya etkisi olur gibi…

pipe Fonksiyonu :

fork fonksiyonu ile birlikte tasarlanmıştır. Bu fonksiyon child ve parent proses iletişimini sağlar.

formatı : pipe (giriş_dosyası, çıkış_dosyası);

kullanımda olmayan dosya değişkenleri

Örnek :

#!/usr/local/bin/perlpipe (GIRIS, CIKIS); # GIRIS ten okutabileceğini CIKIS’ a gönderir$prosesler = fork(); # program child ve parent prosese ayrılırif ($prosesler != 0) { # hangi prosesin child hangisinin parent olduğu test edilir # bu aşamaya gelindiğinde parent prosestir. Parent proses datayı CIKIS yoluyla göndereceğinden, close (GIRIS); # GIRIS erişimine gerek yoktur. Bu yüzden GIRIS’i kapatır. print (“Bir satır giriniz:n”); $oku = ; #Data standart girişten alınır ve print CIKIS ($oku); # CIKIS değişkeni yoluyla child prosese gönderilir } else { # bu aşamada proses child prosestir ve bu yüzden data GIRIS yoluyla alınacağından close (CIKIS); # CIKIS ‘a gerek yoktur CIKIS kapatılır$oku = ; # GIRIS’den datayı okur.Çünki,data CIKIS’dan GIRIS ‘e pipe edilmiştir print ($oku);exit (0); #child proses exit ile ölür ve GIRIS otomatikman kaldırılır }

Çalışması : program.pl

Bir satır giriniz :Bu bir satırdırBu bir satırdır$

exec Fonksiyonu :

Sistem fonksiyonuna benzer. Tek farkı yeni programa başlamadan önce o an çalışan programı keser.

Formatı : exec (liste);

İlk eleman icra edilecek program

sonrakiler ise argümanlardır. exec (“mail ertan”);exec (“vi”, “dosyam.dat”);program adı da kullanabilirsiniz.

exec sık sık fork ile kullanılır. fork iki prosese ayırdığında child, diğer programı exec kullanarak başlatır.

Daha önce system de bahsedilen buffer işlemleri , exec içinde geçerlidir.

syscall Fonksiyonu :

Bir sistem fonksiyonu çağırır.

syscall (liste);

Ilk argüman araya sokulacak sistem çağrısı, diğerleri bu çağrıya aktarılacak argümanlardır.

(UNIX syscall manual sayfalarını inceleyiniz).

syscall kullanımında perl’in syscall.ph başlık dosyası dahil edilmelidir.

[Ör: require (“syscall.ph”)]

PROGRAM veya PROSES BİTİRME

die, warn, exit, kill

die ve warn Fonksiyonları :

Programlardaki önemli mesajları, gönderme fonksiyonlarıdır.

die fonksiyonu programı sonlandırır ve bir hata mesajı verir (standart error dosyasına )

die (mesaj);

warn’da die gibidir. Yalnız programı sonlandırmaz, icra devam eder.

Örnek :

warn(“UYARI!n”); UYARI! (standart error dosyasına yazar) exit Fonksiyonu : Programı sonlandırır. exit (dönüş kodu)

Geçirilecek dönüş kodu exit(2); #2 kodu ile programı bitirir. kill Fonksiyonu : kill (sinyal, proseslistesi);

nümerik sinyal proses ID Listesi (fork ile döndürülen child proses ID gibi)

  • detaylar için UNIX’de kill komutuna bakınız.

sleep Fonksiyonu : Bu fonksiyon verilen saniye sayısı kadar programı bekletir.

sleep (time);

sn cinsinden sayı

sleep(5); (5 sn bekletir)

wait ve waitpid Fonksiyonları :

wait fonksiyonu icrayı devreder ve child prosesin sonlanmasını belirler(fork ile yaratılan proses gibi). Bu fonksiyon argümansızdır.

proses_id = wait();

Burada child proses sonlanınca wait, proses ID’yi proses_id ‘ye atar. (Sonlanan prosesin ID’si. Eğer proses yoksa dönüş değeri –1 olur.)

waitpit ise üzerinde çalışmak istenilen child proses için bekler.

waitpid (proses_id, waitflag);

 

proses ID özel bekleme flag’ı default’u 0’dır(normal bekleme).

beklenecek proses

Eğer 1 dönerse proses bulundu, -1 dönerse bulunmadı demektir.

Örnek :

#!/usr/local/bin/perl$prosesid = fork();if ($prosesid == 0) {# burası child proses kısmıprint (“Basılan ilk satırn”);exit(0);} else {# burası parent proses kısmı, $prosesid içine child prosesin ID’sini döndürür.waitpid ($prosesid, 0);print (“Basılan sonraki satırn”);}

Çalışması : program.pl

Basılan ilk satırBasılan sonraki satırNot : $$ sistem değişkeni, çalışan programın proses ID’sini tutar.

chroot Fonksiyonu : Bu fonksiyon root dizini tanımlar.

chroot (dir); yeni root DIR chroot (“/u/public”);

burası yeni root DIR’ı olur. local Fonksiyonu : Bunu alt program dersinde görmüştük.Matematiksel FonksiyonlarSin, cos, atan2, sqrt, exp, log, abs, rand, srand sin(değer);cos(değer);atan2(değer1, değer2);sqrt(değer);

pozitif exp(değer)

üs log(değer);abs(değer); Örnek: $sonuç=$abs(-3.5); #İçeriği 3.5’dir. rand(deger) #0 ile değer(int) arası sayı üretir.Üretilen değer float point’dır. srand (değer); #rand fonksiyonu kullanarak random sayı üretimine başlatır. String Yönetme Fonksiyonları 1. String’de, alt string arama2. String yaratma3. String içine sub string (alt string) yerleştirme işlevlerini göreceğiz index Fonksiyonu : String içinde ,soldan başlayarak verilen örneği (substringi) arar.Bulduğunda kaçıncı karakterde olduğu bilgisini(pozisyonu) elde eder. pozisyon=index(string, substring);substring, stringde bulunursa, kaçıncı karakter olduğunu ifade eden rakam, pozisyon değişkenine atılır bulunamazsa –1 atılır.

Örnek :

#!/usr/local/bin/perl$oku = ;$pozisyon = index($oku, “tan”);if ($pozisyon >= 0) { print (“tan sözcüğününün bulunduğu pozisyon: $pozisyon n”);} else { print (“tan sözcüğü bulunamadı n”);}

Çalışması : program.pl

Benim adım Ertan TURKMENtan sözcüğününün bulunduğu pozisyon: 13 index 3 argümanlı da tanımlanabilir. 3. argüman substring’in aranmasına kaç karakter atlandıktan sonra başlanacağını belirler. $position = index($oku, “tan”, 5);

Yorum bırakın