Ana Sayfa | Eğitim Cd'leri | Eğitim Kitapları |  212 428 23 21-23 39


 

 

PERL'E DERSLERİ - 3

Döngüler bir degisken ya da liste üzerinde operasyonlari bazi sartlara bagli olarak birden fazla yapmak icin kullanilir. Döngüler konusunu iyice anlamadan, karmasik programlar yazmak mümkün olmayacaktir. Daha önce foreach döngüsüyle tanistik. Bu bölümde döngüler, alternatifler ve bool operatörleri konularini inceleyecegiz.
Döngüler kullanilirken cesitli sartlar göz önünde bulundurulur. Kullanilan sartlarin gecersiz ya da mantiksiz olmasi durumunda kendimizi cabucak sonsuz bir döngü icinde bulabiliriz, bu da programinizin yapmasi gerekeni yerine getiremiyecegi anlamina gelir.
Döngülerde cogu zaman bool operatörleri olarak isimlendirilen true/false (dogru/yanlis) , 1/0, AND, OR, NOT kaliplari kullanilir. Bool operatörleri dogru ya da yanlis verilerini geri verir.
Konuyu derinlemesine incelemeden önce TRUE/FALSE yani dogru ve yanlisin ne oldugunu inceleyelim.PERL dilinde degiskenler dogru ya da yanlis olabilir. Asagidaki örneklere bakalim:

Dogru - Yanlis
---------------------------
1 - 0
'Merhaba' - ' '
(1,2,3) - ( )
33 - '0'


Degiskenin sahip oldugu degere göre dogru ya da yanlis oldugunu tespit edebiliriz. Buna göre degeri belirsiz ya da 0 olan her degisken yanlisdir. Degeri 1 ya da herhangi tanimlanmis bir veri olan degisken dogrudur. Dogru ve yanlisin karsiligini 0 ve 1 olarak tanimlayabiliriz.

Bool operatörlerini yakindan inceleyelim:

AND ( & ): AND operatörünün dogru verisini geri verebilmesi icin iki degiskeninde dogru olmasi gerekmektedir.

0 & 1 | Sonuc
------------
0 0 | 0
0 1 | 0
1 0 | 0
1 1 | 1


OR ( || ): OR operatörünün dogru verisini geri verebilmesi icin en az bir degiskenin dogru olmasi gerekmektedir.

1 || 1 | Sonuc
-------------
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1


NOT ( ! ): NOT operatörü bir degiskenin degerini tersine cevirir. Dogru cinsinden bir veriyi yanlis, yanlis cinsinden bir veriyi dogru yapar.

! | Sonuc
---------
0 | 1
1 | 0



If döngüsü bool operatörlerini kullanarak, if blogu icinde yer alan komutlari calistirmak icin kullanilir. If blogunun icine girebilmek icin if sartinin yerine gelmis olmasi gerekmektedir.

$hava_durumu="iyi";
if ($hava_durumu eq "iyi")
{
print "Sinamaya gidiyorum";
}
else
{
print "Evde kaliyorum";
}


Bu örnekte sart olarak $hava_durumu degiskeninin degeri "iyi" verisiyle karsilastiriliyor. $hava_durumu degiskeninin degeri "iyi" oldugu icin if blogu icinde yer alan print "Sinamaya gidiyorum"; komutu calistirilir. Eger $hava_durumu baska bir degere sahip olsaydi else blogunda bulunan print "Evde kaliyourum"; komutu calistirilacakti. If blogunda bulunan sarti daha kisa yazmaniz mümkün:

if ($hava_durumu) {....}

$hava_durumu degiskeninin degeri belirli yani "iyi" oldugu icin, sart dogru olarak nitelendirilir ve if bolgundaki komutlar calistirilir. Eger $hava_durumu=" "; seklinde bir tanimlama yapsaydik, if ($hava_durumu) yanlis olarak tabir edilecekti ve else blogunda bulunan komutlar calistirilacakti. If döngüsünü asagida yer alan syntax (yazim kurallari) cercevesinde kullanabilirsiniz:

if (sart) {......} else { ......}
if (sart) {......} elsif { ......} else {....}
if (sart) {......} elsif { ......} elsif { ......} else {....}
print "Merhaba" if(sart); #Sart gecerli ise Merhaba ekrana basilir.


Foreach döngüsüyle daha önce tanistik.

# Ekrana 1 den 10 a kadar rakamlari basar
foreach $i (1..10)
{
print $i;
}
# Ekrana HASH tipinde listenin anahtarlarini basar.
foreach $eleman (%HASH)
{
print $eleman;
}
# Ekrana Array tipinde listenin elemanlarini basar.
foreach $eleman (@ARRAY)
{
print $eleman;
}


While döngüsü verilen sart gecerli oldugu sürece blok icindeki komutlari calistirir.

while($sayi<10) { ...... }
$cumle=<STDIN>;
chop($cumle);
while ($cumle)
{
print "Klavyeden $cumle girdiniz";
}

Do
{
print "Selam";
$cuemle=<STDIN>;
chop($cumle);
}
while ($cumle ne "tamam");


Bu örnekte do döngüsü en az bir kere calisir ve ekranadan klavye girisi bekler. Blok disinda while komutuyla bir sart belirlenir. Yukardaki örnekte do icinde girilen kelime "tamam" olmadigi sürece döngü calismaya devam edecektir. Tamam yazmaniz, döngüden cikmanizi saglar.
C/C++ ve Java dilinden tanidigimiz for döngüsü Perl dilinde de ayni syntaxi kullanmaktadir.

for($i=0; $i<10;$i++)
{
print $i;
}


Diger dillerden metod, fonsiyon ya da prosedür olarak tanidigimiz kod birimleri Perl dilinde subrutin (alt program) olarak isimlendirilir. Subrutinleri programin herhangi bir yerinde tanimlayarak, programiniz icinde kullanbilirsiniz. Imprerativ diller olarak bilinen C ve Pascal gibi dillerde subrutinler programlamada kullanilan vazgecilemez araclardir. Subrutin yazarak, belirli kod parcalarini programin istedigimiz yerinde kullanabiliriz. Bu bize öncelikle kod salatasini engelleme firsati verir. Yazdigimiz kod düzenli bir yapiya kavusur ve daha da önemlisi bir kere yazdigimiz kodu programin cesitli yerlerinde subrutinin ismini yazarak kullanabiliriz.

&ekrana_bas();
.
.
.
sub ekrana_bas
{
print "Bu bir denemedir";
}


Subrutin programin herhangi bir yerine konabilir. Yazdigimiz subrutini & isaretini kullanarak, program icerisinde calistirabiliriz. Perl icinde kullanabilecegimiz hazir subrutinler bulunmaktadir:

$karekok=sqrt(2); print $karekok;


Yukardaki örnekte, sqrt() isimli Perl subrutinini kullanarak, 2 sayisinin karekökünü hesapladik. sqrt subrutini 2 rakaminin karekökünü hesaplayarak, sonucu $karekoek isimli degiskene esitler. Burada dikkatimizi ceken bir nokta var: sqrt() subrutininde parantezler icinde 2 rakamini yazdik. $karekoek degiskeninin degeri 1.414213..... olacaktir. Eger 2 yerine 4 yazmis olsaydik, sonuc 2 olacakti. Bu nasil gerceklesiyor? Bir subrutine parametre girisi olarak isimlendirilen bu teknigi bundan sonraki bölümde ele alacagim. Subrutinlere parametre girisi sikca kullanilan ve yazilan kodun cok dinamik bir sekilde kullanilmasini saglayan bir teknikdir.
Parametre, sqrt() örneginde oldugu gibi subrutine gönderdigimiz rakamdir. Subrutinlere skalar ve liste cinsinde parametre gönderebiliriz.

$a=5;
$b=10;
$c=&topla($a, $b);
print $c;
##################
sub topla
{
local($x,$y,$z) = @_;
$z=$a+$b;
}


Program nasil calisiyor?
Önce $a ve $b isimlerinde iki degisken tanimladik. Daha sonra bu degiskenleri toplama operasyonunu gerceklestirmek icin yazdigimiz subrutine parametre olarak gönderiyoruz. Burada ilginizi ceken $c=&topla($a, $b); tanimlamasi olabilir. $c degiskeninin degeri, toplama icin kullanilan subrutinin geri verdigi degerdir. Subrutin icinde yer alan en son satirdaki deger, geri verilen degeridir. Subrutin icindeki en son satir $z=$a+$b; oldugu icin, $z degiskeninin degeri ana programa geri verilir.
@_ degiskeni Perl derleyicisi tarafindan rezerve edilmis ve gönderilen parametreleri ihtiva eden liste tipinde bir degiskendir. Eger bu degeri herhangi bir degiskene esitlersek, subrutine gönderilen parametreleri, subrutin icinde kullanabiliriz.

Istersek örnegi daha kisa sekilde yazabiliriz:

$a=5;
$b=10;
&topla($a, $b);
#############
sub topla
{
local($x,$y,$z) = @_;
$z=$a+$b;
print $z;
}



Subrutin icinde bulunan en son satirdaki komut print $z; oldugu icin, &topla(...) sekliden ana programda kullandigimiz subrutin, $a ve $b degiskenlerinin degerlerini toplayarak sonucu ekrana basar.
Subrutin icinde yer alan en son satir, her zaman geri gömdermek istedigmiz deger olmayabilir. Örnegin bir döngü kullandiginizda, geri göndermek istediginiz deger, blok icinde bulunan bir deger olabilir. return $degisken; komutunu kullanarak, istediginiz bir degeri subrutin icinden geri gönderebilirsiniz.

$a=5;
$b=10;
&karsilastir($a, $b);
###############
sub karsilastir
{
local($x,$y,$z) = @_;
if ($a<$b)
{
return print $a;
}
else
{
return print $b}
}


Isterseniz subrutin icinde birden fazla degeri geri verebilirsiniz. Asagidaki örnekte ($saniye, $dakika, $saat) listesi ana programa geri verilir.

($a, $b, $c)=&zaman();
print "Saat su an: $c:$b:$a\n";
################
sub zaman
{
return ($saniye, $dakika, $saat)=localtime();
}


Perl dilinin en gelismis yetenelerinin basinda dosyalar üzerinde yapabilecegimiz operasyonlar geliyor. Perl dilinde, bir dosyayi acip, icerigini ekrana basmak, istedigimiz degisiklikleri yapmak, bazi kelimeleri taramak bir kac satirlik kodla yapabilecegimiz islemlerdir.
Bir dosya üzerinde cesitli islemler yapabilmemiz icin, bu dosyayi acmamiz gerekiyor:

open(ANAHTAR, "< dosya.ismi");


Open fonksiyonunu kullanirken dikkat etmemiz gereken iki nokta var: ANAHTAR degiskenini bir nevi anahtar olarak düsünebiliriz. Bir dosya acildiktan sonra ANAHTAR degiskeni icine bu dosya üzerinde operasyon yapabilmek icin gerekli anahtar yerlestirilir. ANAHTAR yerine istediginiz bir ismi kullanabilirsiniz. Sistem üzerinde mevcut olan bir dosyayi okumak icin acmak istiyorsaniz "<" operatörünü kullanabilirsiniz. Eger yeni bir dosya acmak istiyorsaniz, ">" kullanabilirsiniz. ">" operatörüyle yeni bir dosya acilir. Eger sistem üzerinde bu isimde bir dosya varsa, dosya silinir ve kullanilmak üzere acilir. Bu operatörü kullaniken dikkatli olmaniz gerekiyor. Istemeden sisteminiz üzerindeki bir dosyayi, bu operatörü kullanarak silebilirsiniz. Sistem üzerinde bir dosyanin sonuna ekleme yapmak istiyorsaniz ">>" operatörünü kullanin. ">>" operatörü istediginiz dosyayi acar ve verileri dosyanin sonuna ekler.

Asagida yer alan program, kendi kodunun bulundugu dosyayi acarak, kodu ekrana basar.

open(DOSYA, "< dosya.pl");
while($satir=)
{
print $satir;
}


Verdigimiz dosya ismi yanlis ya da dosya sistem üzerinde yok ise, yukarda yer alan program ekrana hicbirsey basmiyacaktir. En azindan programin, dosyayi bulamadigina dair bir mesaji ekrana basmasi, hatayi kisa zamanda bulmamizi sagliyacaktir. Open fonsiyonu, eger dosyayi acabilirse 1, acamassa 0 geri verir (yani dogru ve yanlis). Bir if döngüsü kullanarak, open fonksiyonunun basarili olup, olmadigini ögrenebilir ve ekrana gerekli mesaji basabiliriz.

Asagida yeralan kod bunu yapmaktadir:

if(open(DOSYA, "< dosya.pl"))
{
while($satir=<DOSYA>) {
print $satir;
}
}
else
{
print "Dosya ne yazik ki bulunamadi. Tekrar deneyin\n";
}


Asagida yer alan program, klavyeden dosya ismi alarak, dosyayi acar ve icerigi ekrana basar:

$isim=<STDIN>; if(open(DOSYA, "< $isim"))
{
while($satir=)
{
print $satir;
}
close(DOSYA);
}
else
{
print "Dosya ne yazik ki bulunamadi. Tekrar deneyin\n";
}

Dosyalar open fonsiyonu ile acildiktan sonra, program sonunda close komutuyla kapatilmaldir. Isletim sistemi ayni anda sinirli sayida dosyayi acik tutabilir. Belirli sayida open dan sonra, sistem diger dosyalari acamaz hale gelebilir. Bunu engellemek ve sistemin düzgün bir sekilde calismasini saglamak icin close( ) komutunu kullanarak, actiginiz dosyalari kapatmayi aliskanlik haline getirin

 

Murat KUZU