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 dikkatli
kullanı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 inceleyelim
program 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 for
dö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
>