Bölüm 2: Perl Değişkenleri
Perl'de işe yarar programlar yazabilmek için Perl değişkenlerini tanımamız gerekir. Değişken demek, değerleri saklayacağımız yer demektir. Değişkene değer atadıktan sonra program boyunca bu değeri geri çağırabilir, kullanabilir ve değiştirebiliriz. Perl'de 3 çeşit değişken mevcuttur: Scalar, Array ve Hash değişkenler.
Scalar Değişkenler
Scalar değişkenlere tek bir değer atanır. Bu değer bir sayı, bir cümle ya da başka bir scalar değişken olabilir. Scalar değişkenlerin adlarının başında $ işareti bulunur. Örneğin $x, $y, $z, $adres, $kullanici birer scalar değişken adıdır. Scalar değişkenlere değer atama işlemi de aşağıdaki örneklerde görüldüğü gibi yapılır.
$sayi = 1;
$isim = "Sinan";
$pi = 3.141592;
Değişkenleri kullanmadan önce tanımlamanıza gerek yoktur. Ayrıca Perl değişkenleri program içinde tip de değiştirebilir. İşte bir örnek:
$sihir = 23;
$sihir = "Sihirli sayımız $sihir";
Bazı programlama dillerinin tersine Perl bu durumu kabul eder ve bir hata mesajı vermez.
Şimdi ilkscript.pl isimli scripti biraz değiştirelim ve birkaç değişken ekleyelim:
#!/usr/bin/perl
$kursadi = "CGI Programlama";
print "Merhaba. Adın ne?\n";
$siz = <STDIN>;
chomp($siz);
print "Merhaba $siz. $kursadi kursuna hoş geldiniz.\n";
Scripti kaydedin ve UNIX'te çalıştırın. Program size isminizi soracak ve birşeyler yazıp enter'a basmanızı bekleyecektir. Bu işlem
$siz = <STDIN>;
satırı dolayısıyla gerçekleşir. Yazdığınız yazı $siz değişkenine atanır. Yazdığınız yazının sonundaki enter tuşunu simgeleyen "Carriage Return" karakteri aşağıdaki komut satırı ile silinir.
chomp($siz);
Aşağıdaki satır işletildiğinde değişkenlerin yerine atandığı değerler ekranınızda görünür. En sondaki \n Per'de "Carriage Return" işaretini temsil eder. Yani programa, yazıyı yazdıktan sonra enter'a basmasını söyler.
print "Merhaba $siz. $kursadi kursuna hoş geldiniz.\n";
Array Değişkenler
Array'ın Türkçe karşılığı "Dizi"dir. Array değişkenler için değerler listesi diyebiliriz. Scalar değişkenler tek bir değer içermesine karşın array değişkenler birden fazla değer içerirler. Array değişken adlarının başında at işareti (@) bulunur. İşte bir örnek:
@renkler = ("sari","kirmizi","yesil");
Perl'de dizi indisleri 0'dan başlar. Yani @renkler dizisinin ilk elemanını $renkler[0] verir. @renkler dizisinin tek bir elemanının değerini göstereceği zaman @ işareti yerine $ işareti kullanılır. $ işareti tek bir değeri, @ işareti ise bütün diziyi kastettiğimiz anlamına gelir.
Bir dizinin tüm elemanları şu şekilde yazdırılabilir:
#!/usr/bin/perl
# bu bir açıklamadır.
# diyez (#) işareti ile başlayan bütün satırlar açıklamadır.
@renkler = ("sari","kirmizi","yesil");
print "$renkler[0]\n";
print "$renkler[1]\n";
print "$renkler[2]\n";
Fakat elbette ki bunu yapmanın daha kolay bir yolu var. foreach yapısı kullanılarak dizileri rahatlıkla yazdırabiliriz.
#!/usr/bin/perl
# bu bir açıklamadır.
# diyez (#) işareti ile başlayan bütün satırlar açıklamadır.
@renkler = ("sari","kirmizi","yesil");
foreach $i (@renkler) {
print "$i\n";
}
foreach döngüsünün her tekrarlanışında $i değişkenine @renkler dizisinin bir elemanı atanır. İlk tekrarda $i değişkeninin değeri "sari", ikinci tekrarda "kirmizi" ve üçüncü tekrarda "yesil" olur. { ve } parantezleri döngünün başlangıç ve sonunu belirtir. Yani bu parantezler arasında kalan komutlar $i değişkeninin bütün değerleri için tekrarlanır.
Dizi Fonksiyonları
Perl'de dizilere değer atamayı ve dizilerden değer okumayı kolaylaştıran fonksiyonlar mevcuttur.
@renkler = ("sari","kirmizi","yesil","mavi","turuncu","bordo");
$ilkrenk = pop(@renkler);
# $ilkrenk değişkenine @renkler dizisinin ilk değeri olan "sari" atanır.
$sonrenk = shift(@renkler);
# $sonrenk değişkenine @renkler dizisinin son değeri olan "bordo" atanır.
Bir diziye değer eklemek için push fonksiyonu kullanılır:
push(@renkler,"gri");
# @renkler dizisinin sonuna "gri" ilave edilir.
@yenirenkler = ("lacivert","pembe");
push(@renkler,@yenirenkler);
# @yenirenkler dizisindeki değerler @renkler dizisinin sonuna ilave edilir.
Dizilerle ilgili işe yarayabilecek birkaç fonksiyon daha:
sort(@renkler);
# @renkler dizisinin elemanlarını alfabetik sıraya koyar.
reverse(@renkler);
# @renkler dizindeki elemanların diziliş sırasını ters çevirir.
@join(", ",@renkler);
# @renkler dizisini elemanların arasında ", " olacak şekilde birleştirir.
$uzunluk = $#renkler;
# $uzunluk değişkenine @renkler dizisinin uzunluğu atanır.
Hash Değişkenler
Hash değişkenleri Array değişkenlerin özel bir hali olarak düşünebiliriz. Hash değişken adlarının başında yüzde işareti (%) bulunur. Hash değişkenler öğe çiftlerinden oluşur: Anahtar ve Değer. Aşağıdaki örneği inceledikten sonra daha rahat anlayacağınızı tahmin ediyorum:
Değişken Anahtar Değer
%sayfalar = ( "sinan", "http://www.sinanilyas.cjb.net",
"koray", "http://cc.sau.edu.tr/~ktoksoz",
"baris", "http://turk.eu.org/uruzgar");
Aynı Hash şu şekilde de tanımlanabilir:
%sayfalar = ( "sinan" => "http://www.sinanilyas.cjb.net",
"koray" => "http://cc.sau.edu.tr/~ktoksoz",
"baris" => "http://turk.eu.org/uruzgar");
%sayfalar değişkeninde anahtar olarak kişinin ismini, değer olarak da web sayfasının adresi saklanır. Tıpkı Array'de olduğu gibi, bir Hash değişkenden tek bir değer okunacağı zaman $ işareti kullanılır.
print "$sayfalar{'baris'}\n";
Yukarıdaki satır Barış'ın web sayfasının adresini yazdırır. Eğer değişkendeki bütün değerleri yazdırmak istiyorsanız bir foreach döngüsü kullanabilirsiniz:
foreach $anahtar (keys %sayfalar) {
print "$anahtar'ın web sayfasının adresi: $sayfalar{$anahtar}\n";
}
Bu örnekte %sayfalar değişkeninin anahtarlarını öğrenebilmek için bir hash değişkeninin anahtarlarını dizi olarak veren keys fonksiyonu kullanılmıştır. keys fonksiyonunun tek bir dezavantajı vardır: Anahtarları rastgele bir sırayla vermesi. Yani bu örnekte kimin adresinin önce, kiminkinin sonra ekrana yazılacağı belli değildir. Adresleri belli bir sırayla yazdırmak istiyorsanız aşağıda gösterildiği gibi foreach döngüsünde anahtarları kendiniz yazmalısınız.
foreach $anahtar ("sinan","koray","baris") {
print "$anahtar'ın web sayfasının adresi: $sayfalar{$anahtar}\n";
}
Hash değişkenler formla gönderilen verileri ayırmada çok işimize yarayacak. Örneğin $form{'soyad'} bize formunuzdaki soyad kutucuğuna yazılan değeri verecek. Televizyoncuların deyimiyle: "AZ SONRA!"
Neyse, biz yine işimize bakalım ve adres listesi veren bir web sayfası üreten yeni bir CGI scripti yazalım. Tabi ki Hash değişken kullanarak.
#!/usr/bin/perl
%sayfalar = ("sinan" => "http://www.sinanilyas.cjb.net",
"koray" => "http://cc.sau.edu.tr/~ktoksoz",
"baris" => "http://turk.eu.org/uruzgar" );
print "Content-type:text/html\n\n";
print <<IlkKisim;
<html><head><title>Adres Listesi</title></head>
<body>
<h2>Adres Listesi</h2>
<ul>
IlkKisim
;
foreach $anahtar (keys %sayfalar) {
print "<li><a href=\"$sayfalar{$anahtar}\">$anahtar</a>\n";
}
print <<SonKisim;
</ul>
<p>
</body>
</html>
SonKisim
;
Yukarıdaki scripti "adreslistesi.cgi" adıyla kaydedin ve çalıştırılabilmesi için erişim yetkilerini 755 olacak şekilde değiştirin. Sonra da web browser'ınızdan çağırın. Açılan sayfada isme tıkladığınız zaman o kişinin web sayfasının açıldığını göreceksiniz.