AKIŞ KONTROL İFADELERİ Bu konuyla ilişkili olarak 3.dersi görmüştük. Şimdi dersi biraz daha genişletiyoruz. Tek satırlı şart ifadesi Daha evvel if ifadesini şöyle kullanmıştık,if ($var == 0) { print ("Bu sıfırdır.\n"); } Bu ifadeyi tek satırda gösterme özelliği de vardır. print ("Bu sıfırdır.\n") if ($var == 0); her iki örnekte aynı işleve sahiptir. Bu biçim unless,until,while gibi şart ifadelerinde de kullanılır. Ör:print ("Bu sıfırdır.\n") unless ($var != 0);print ("Henüz sıfır değil.\n") while ($var-- > 0);print ("Henüz sıfır değil.\n") until ($var-- == 0); Tek satırlı komut kullanımlarında özellikle döngü değeri artış ifadelerinde hata yapma ihtimali olduğundan bu tip ifadeler de dikkatlikullanılmalıdır. Örneğin,
$count = 1;print ("$say\n") while ($say++ < 5); ifadelerinde ekrana basılan ilk değer 2 dir.1 değildir. v.b.... Örnek program : Adı:whprg1.pl olsun
#!/usr/local/bin/perl$say = 0;print ("$say\n") while ($say++ < 5); Çalışması :>whprg1.pl 1 2 3 4 5>
FOR DÖNGÜSÜ KULLANIMI For döngüsü kullanımını bildiğiniz bir döngü çeşididir. Genel format:for (ilk değer ataması; koşul; sayac arttırma) { komut satırları bloğu } Örnekle inceleyelimprogram adı forprg1.pl olsun #!/usr/local/bin/perl for ($sayi=1; $sayi <= 5; $sayi++) { print ("$sayi\n"); }# 1.ilk değer atanır# 5 ten kucuk veye eşit mi? sorusunun cevabı evet ise döngüye girilir# sayı yazdırılır# sayac 1 arttırılır ve tekrar koşul sınanır.# koşul sonucu evet ise işlem bir önceki gibi devam eder,hayır ise döngü dışına çıkılır. Çalışması :>forprg1.pl 1 2 3 4 5>
For dögülerinde bazen her bir değer artışından(döngü sayacı) evvel birden fazla komut uygulamak gerekebilir. Bu durumda fordöngüsünde , (virgül) kullanılır. Örneğin aşağıdaki program parçasını inceleyelim ve aynı işlemleri for ile nasıl kullandığımızı görelim. $satir = <STDIN>; $say = 1; while ($say <= 3) { print (satir); satir = <STDIN>; $say++;}
Bu satırlarla yapılanı for ile gerçekleştiren programın kodu aşağıdadır. #!/usr/local/bin/perl for ($satir = <STDIN>, $say = 1; $say <= 3; $satir = <STDIN>, $say++) { print ($satir);}
FOREACH döngüsü ---- Liste ve Dizi elemanlarını okuma Genel formatı:foreach localdeğişken (liste-dizi) {deyimler grubu; } foreach dizilerden kolaylıkla eleman almak amacıyla kullanılan, perl'e has bir zenginliktir. Diziden liste elemanı local değişkene atanır.Her dönüşte sıradaki liste elemanı alınır. Bu deyim programlarda çok kullanılır. Örnek program : Program adı forprg2.pl olsun
#!/usr/local/bin/perl@words = ("Bu", "bir", "liste", "dir.");foreach $word (@words) { print ("$word\n"); } Çalışması:>forprg2.pl Bu bir liste dir.>
Bir başka örnek program : forprg3.pl program ekrandan girilen satırdaki kelimeleri sıralar ve ters sıraya sokar ve basar. #!/usr/local/bin/perl $line = <STDIN>; $line =~ s/^\s+//; $line =~ s/\s+$//; foreach $word (reverse sort split(/[\t ]+/, $line)) { print ("$word "); } print ("\n"); Çalışması: > test icin bir satir girdim test satir icin girdim bir > Çalışmanın Açıklaması: Önce split ile satirdaki kelimeler bölünür. ("test", "icin", "bir", "satir" , "girdim") sonra bunlar sıralanır.(hazır fonksiyon olan sort ile) sıralama sonucu listenin durumu:("bir", "girdim" , "icin", "satir" , "test") Bir sonraki aşama da liste ters sırada sıralanır.(reverse hazır fonk.) listenin son durumu:("test", "satir" , "icin", "girdim" , "bir") olur. Bu durumdaki liste ekrana basılır. DO DEYİMİ: genel format: do { deyimler bloğu } while_veya_until (şart_ifadesi);biçimindedir. Örnek kullanım: do { $line = <STDIN>; } while ($line ne ""); satır sonu değilse döngü devam eder. Aynı sonucu aşağıdaki kodlama da verir. do { $line = <STDIN>; } until ($line eq ""); Buradaki şart ifadesinde ise satır içeriği boş olana(giriş yok) kadar döngüyü uygular. Örnek program : doprg.pl
#!/usr/local/bin/perl $sayac = 1; do { print ("$sayac\n"); $sayac++; } until ($sayac > 5); >doprg.pl 1 2 3 4 5> LAST deyimi: Döngüden çıkışı sağlar.
Örnek program: lastprg.pl
#!/usr/local/bin/perl $toplam = 0; while (1) { $satir = <STDIN>; if ($satir eq "") { last; } chop ($satir); @sayilar = split (/[\t ]+/, $satir); foreach $sayi (@sayilar) { if ($$sayi =~ /[^0-9]/) { print STDERR ("$sayi sayi degil\n"); } $toplam += $sayi; } }print ("Toplam: $toplam.\n"); Çalışması:>lastprg.pl 4 5 7 2 11 6 ^D Toplam: 35.> NEXT deyimi : Döngüde, Bir sonraki dönüşe atlatır.
Örnek Program: nex.pl
#!/usr/local/bin/perl print ("Toplam için son sınır sayısını gir:\n"); $limit = <STDIN>;chop ($limit); $say = 1; $toplam = $cifttoplam = 0;for ($say = 1; $say <= $limit; $say++) { $toplam += $say; if ($say % 2 == 1) { # sayı tek ise sonraki dönüşe atla next; }$cifttoplam += $say;}print(" 1 den $limit ye kadar olan sayıların toplamı: $toplam\n");print("Bu sınırdaki çift sayıların toplamı ise: $cifttoplam\n"); Çalışması:>nex.pl Toplam için son sınır sayısını gir: 7 1 den 7 ye kadar olan sayıların toplamı: 28 Bu sınırdaki çift sayıların toplamı ise: 12> Bir başka next örneği içeren program: nex2.pl. Bir kelime sayma programıdır. #!/usr/local/bin/perl$toplam = 0;while ($satir = <STDIN>) # kelime girişi yap, ctrl+d ye basılırsa döngüden çıkılır { $satir =~ s/^[\t ]*//; # baştaki boşluk ve tabları at $satir =~ s/[\t ]*\n$//; # sondaki boşluk,tab ve \n karakterlerini(yeni satır) at next if ($satir eq ""); #satır boşsa sonraki dönüşe atla @kelimeler = split(/[\t ]+/, $satir); # kelimeleri aralarındaki # boşluk ve tab'lardan # ayırarak diziye yerleştir $toplam += @kelimeler; # dizi boyutundan elde edilen eleman (kelime) # sayısı değerini tut }print ("Toplam kelime sayısı: $toplam\n"); Çalışması: >nex2.pl Bir kac kelime girelim program kelime sayısını versin. ^D Toplam kelime sayısı: 8 REDO DEYİMİ : Döngüdeki bir dönüşü yeniden başlat
Örnek programla inceleyelim. redoprg.pl #!/usr/local/bin/perl $toplam = 0; for ($say = 1; $say <= 3; $say++) { $satir = <STDIN>; last if ($satir eq ""); $satir =~ s/^[\t ]*//; $satir =~ s/[\t ]*\n$//; redo if ($satir eq ""); @kelimeler = split(/[\t ]+/, $satir); $toplam += @kelimeler; } print ("Toplam kelime sayısı: $toplam\n"); Çalışması:>redoprg.pl Test satırı. Bu da ikincisi. ^D Toplam kelime sayısı: 5> VERİLEN ETİKETE GİTME : Bazen dallanmalarda programın herhangi bir bölümüne atlamamız gerekir. Bu bölümlere ulaşmak için bölüme ait etiket adı veriler.Aşağıda kullanılan DONE: sintaksı bir etiketi belirler. next ve redo ile de etiket kullanılır. (redo etiket; gibi).
Örnek program : etprg.pl
#!/usr/local/bin/perl$toplam = 0;$ilksayac = 0;DONE: while ($ilksayac < 10){ $ikincisayac = 1; while ($ikincisayac <= 10) { $toplam++; if ($ilksayac == 5 && $ikincisayac == 9) { last DONE; } $ikincisayac++; } $ilksayac++;} print ("$toplam\n"); Çalışması:>etprg.pl 59> CONTİNUE bloğu: Örnek görerek anlamaya çalışalım: $i = 1; while ($i <= 10) { print ("$i\n"); } continue { # continue bir blokla kullanılır ({ } arasında) $i++; } Yukardaki örnekte continue bloğundaki $i++ aşağıda for bloğundaki görevi yapar. for ($i = 1; $i <= 10; $i++) { print ("$i\n"); } Her iki örnekteki çalışma aynıdır.continue genelde while ve until ile kullanılır. for da buna gerek yoktur. GO TO etiket deyimi: go to yanında belirtilen etikete program akışını yönlendirir.etiket, do veya altyordam(sub) içinde tanımlı olmamalıdır.Ör:#!/usr/local/bin/perl NEXTLINE: $line = ; if ($line ne "") { print ($line); goto NEXTLINE; } Çalışması: bu bir satırdır. bu da bir satırdır. ^D>