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
>