Neden Perl?
"Practical Extraction and Report Language" (Pratik Ayıklama ve Raporlama Dili) sözcüklerinin baş harfleri, Bazılarına göre de "Pathologically Eclectic Robbish Lister" (Aşırı derecede seçici zırva listeleyicisi) sözcüklerinin baş harfleri...Adının anlamı şu veya bu olsun; Perl çok kısa zamanda gelişen ve yaygınlaşan bir programlama aracı olarak bilgisayar tarihindeki yerini aldı bile. Larry Wall işi gereği büyük metin dosyalarını işleyen ve bunlardan raporlar üreten uygulamalar geliştiriyordu. Bu işler için genellikle standart UNIX araçları olan awk, sed gibi yazılımları kullanıyordu ama bunların da yetersiz kaldığı durumlarla çok sık karşılaşıyordu. Bunun üzerine kendi gereksinimlerini karşılamak için metin dosyalarını işlemede önemli üstünlükleri olan Perl yorumlayıcısını geliştirdi.
Perl bir yorumlayıcı, yani Perl kodu derlenip makina diline çevrilmiyor. Bu nedenle çok hızlı çalışması gereken programlar yazmaktan çok; çok hızlı yazılması gereken programlama problemlerinde kullanılıyor.
Bir başka önemli özelliği, çok ama çok geniş bir kütüphaneye sahip olması. Aslında bu çılgın kütüphane doğrudan Perl'e ait değil. Bu kütüphanenin "çılgın" olmasının asıl nedeni açık kod Perl programcılarının geliştirdikleri kodların cpan.org (O'Reilly destekli) tarafından çok iyi organize edilen bir arşivde tutulması.
Aklınıza gelebilecek her donanım platformu için Perl yorumlayıcısı var ( www.perl.org ). Bu da Perl ile yazılan kodların mükemmel bir şekilde taşınabilir olmasını sağlıyor.
Perl her ne kadar web üzerinde çalışacak CGI (Common Gateway Interface) yazılımları için gelitirilmiş olmasa da gelişmiş karakter dizisi işleme özellikleri ve zengin kütüphaneleri sayesinde CGI dünyasının da ası olmuştur.
Neyse; bu kadar laf yeter.
Bu Perl köşesinde ağırlayacağım okuyucu kitlesinin zaten programcı olduklarını varsayacağım; yani programlama öğretmeye çalışmayacağım. Konuları bir çok programlama dili kitabında olduğu gibi klasik "değişkenler, diziler, operatörler, fonksiyonlar" gibi başlıklar altinda sıralamayacağım. Doğrudan örnek programlar vererek, Perl'in yeteneklerini bu örnekler üzerinde vurgulayacağım.
İşte ilk örnek:
UNIX/LINUX altında çalışan bir bilgisayarda, /etc/passwd dosyasında kaç tane kullanıcı tanımlı olduğunu saymamız gerekiyor. Ne işe yarar bilmem ama, işte iş olsun diye...
Tipik bir /etc/passwd dosyasından alınmış birkaç satır aşağıdaki gibi olacaktır:
root:x:0:0:root:/root:/bin/bash nobody:x:99:99:Nobody:/: bin:x:1:1:bin:/bin: daemon:x:2:2:daemon:/sbin: adm:x:3:4:adm:/var/adm: lp:x:4:7:lp:/var/spool/lpd: shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown sener:x:506:506:Mehmet Sener:/home/sener:/bin/bash paul:x:507:507:Paul Mark:/home/paul:/bin/bash tulin:x:508:508:Tulin Keremoglu:/home/tulin:/bin/bash ekrem:x:512:512:Ekrem Tuzun:/home/ekrem:/bin/bash arslan:x:513:513:Ahmet Arslan:/home/arslan:/bin/bashHer kullanıcı için bir satır olan bu dosyada bazı kullanıcılar gerçek birer kullanıcı değildir. Örneğin "bin", "adm", "lp" gibi kullanıcılar gerçek birer şahıs değil; sistemde çalışan bazı süreçlerin sahipleri olsun diye tanımlanmış kullanıcılardır.
/etc/passwd satırlarında her kullanıcı için, iki nokta üstüste işaretleriyle ayrılmış bilgi alanları vardır:
Örneğin
arslan:x:513:513:Ahmet Arslan:/home/arslan:/bin/bashsatırından açık adı "Ahmet Arslan" olan kullanıcının kullanıcı kodunun "arslan" olduğu, şifresinin /etc/shadow dosyasında tutulduğu ("x"), kullanıcı ve grup numaralarının 513 olduğu, kişisel dosyalarını saklayacağı dizinin "/home/arslan" olduğu ve bu kullanıcı sisteme bağlandığında kendisi için "bash" kabuk programının başlatılacağı anlaşılıyor. /etc/passwd dosyasını incelediğinizde sadece gerçek kullanıcıların /home altında bir kişisel dizine sahip olduklarını gözleyeceksiniz. Bu nedenle sistemde kayıtlı olan gerçek şahısların sayısını bulmak için yapmamız gereken /etc/passwd dosyasında, içinde "/home/" dizisi geçen satırları saymak olacaktır. İşte bu işi yapan bir Perl programı:
#!/usr/bin/perl # # /etc/passwd dosyasında kayıtlı gerçek kullanıcı sayısını bulur. # /home altinda bir kişisel dizini olan herkes gerçek kullanıcı kabul edilir. open (PWD, "/etc/passwd"); # # $n : Sayılan kullanıcı sayısı $n = 0; while ( $satir = < PWD > ) { if ( $satir=~ /home/ ) { $n++; } } close (PWD); print "Bu sistemde $n kullanıcı kayıtlı!\n\n"; exit;Şimdi satır satır bu programı bir gözden geçirelim:
#!/usr/bin/perl
Bu satır, tipik bir UNIX kabuk programı ilk satırıdır. Bu satırın ardından gelecek satırların hangi yazılım tarafından yorunlanacağını gösterir. Benim bilgisayarımda Perl yorumlayıcısı /usr/bin/perl altında durduğu için, Perl kodumun ilk satırı #!/usr/bin/perl dir. Her ne kadar satırın başındaki "#" satırın bir açıklama satırı olduğunu belirtiyor gibi görünse de gerek bu satırın ilk satır olması gerekse "#" ardından gelen ilk karakterim "!" olması durumu değiştirmektedir. Kendi bilgisayarınızda Perl yorumlayıcısının nerede olduğunu bulmak isterseniz "which perl" komutunu kullanabilirsiniz.
# /etc/passwd dosyasında kayıtlı ...
Açıklama satırı...
open(PWD, "/etc/passwd");
Kayıtlarını okumak istediğiiz dosyayı açma komutudur. "PWD" sözcüğü, programın devamında söz konusu dosyaya erişmek için kullanacağımız bir "dosya tanımlayıcısıdır (file handle). Aynı değişken isimleri gibi dosya tanımlayıcısı olarak ne isterseniz kullanabilirsiniz (tabii ki Perl dili kurallarına uygun olmak koşuluyla). Perl geleneği dosya tanımlayıcılarının büyük harflerle yazılmasını gerektirir.Dosyayı yalnızca okumak için açtığımız için dosya tanımlayıcısı ve adından başka birşey belirtmeye gerek yok. Eğer dosyayı yazmak amacıyla açsaydık
open(PWD, ">/etc/passwd");komutunu; dosyaya kayıt eklemek üzere açsaydık da
open(PWD, ">>/etc/passwd");open deyimlerini kullanmamız gerekirdi.Yeri gelmişken;
- Perl deyimleri noktalı virgülle bitirilir;
- Perl değişken isimlerini genel olarak tüm programlarında geçerli olan kurallara uymalısınız; fazladan dikkat etmeniz gereken büyük-küçük harf ayırımıdır. "$Kayit" ve "$kayit" farklı değişkenlerdir.
$n = 0;
"$n" değişkenine sıfır değerini veren basit bir atama deyimi... "Peki '$' da neyin nesi?" diye soruyorsanız işte o sorunun yanıtı biraz karışık! Dikkat ettiyseniz programda hiç değişken tanımı; yani deklarasyon yok! Kullanıcıları saymak için kullanacağımız "n" değişkeninin ne tamsayı, ne kayan noktalı sayı olduğundan söz etmedik. Etmedik, çünkü Perl'de bu kavramlar yok!Perl'de sayıl değişkenler (scalar) ve diziler (array) var. Sayıl değişkenlerin isimleri $ işaretiyle başlar. Sayıl değişkenlerde tek bir değer saklayabilirsiniz. Bu değerin tamsayı (integer) ya da kayan noktalı sayı (float) olması önemli değildir. Gerektiği durumlarda dönüşümler Perl yorumlayıcısı tarafından otomatik olarak yapılır.
while ( $satir = < PWD > ) { ... }
Bir taşla iki kuş vuran bir satır! Hem tanımlayıcısı PWD olan dosyadan bir satır okuyup okunan satırı bir karakter dizisi olarak "$satir" değişkenine atıyor; hem de dosyadan hala kayıt okunup okunamadığını kontrol ediyor. Bu komutu "PWD dosyasından $satır okunabildiği sürece tekrarla" diye okuyabilirsiniz."Oku" komutu nerde? diye soruyorsanız "<" ve ">" işaretleri arasında diye yanıtlayacağım. Bir dosya tanımlayıcısını "<" ve ">" işaretleri arasında yazdığınızda o dosyadan bir satır okumak istediğinizi belirtmiş olursunuz.
Eğer okuma komutunuzu, dosya tanımlayıcısı belirtmeden "<>" diye yazarsanız "standart giriş" biriminden, yani klavyeden okumak istediğinizi belirtmiş olursunuz.
if ( $satir=~ /home/ ) { ... }
Bu satırı da "$satır içinde 'home' sözcüğü geçiyorsa" diye okuyabilirsiniz. Bir başka programlama dili olsa bu satırı
if ( index($satir, "home") ) { ... } ya da if ( substr($satir, "home") > 0 ) { ... }falan diye yazardık. Ama Perl'de ileride de göreceğiniz gibi son derece kuvvetli bir yapı olan regexp (Regular Expression) yapısı var. Şimdilik bunun ayrıntılarına girmeyeceğim ve$satir=~ /home/deyiminin "$satir değişkeninin değeri /home/ kalıbına uyuyor mu?" diye okunduğunu belirtip devam edeceğim. ( =~ operatörü bir atama yapmaz; yani bu işlem sonucunda $satir değişkeninin değeri değişmez. )
Programın gerisini açıklamaya gerek yok sanırım.
Denemek istiyorsanız bu programı herhangi bir editörle yazdıktan sonra program dosyanızı "çalıştırılabilir" dosya yapmayı unutmayınız.
Yani;
$ pico prog1.pl $ chmod a+x prog1.pl $ ./prog1.plBildiğiniz gibi UNIX'te dosya uzantısının özel bir anlamı yoktur. Bu nedenle program dosyasına yalnızca "prog1" adını da verebilirdik. Ancak bir dosyanın içeriği konusunda bir bakışta fikir sahibi olabilmek için Perl programları içeren dosyalara ".pl" veya ".perl" gibi bir uzantı vermenizi öneririm.
Bir hafta sonra yeni bir Perl program örneğinde buluşmak ümidiyle..
Bir suredir bir scripting dili ogrenmek istiyorum fakat Perl ve PHP arasinda secim yapamiyorum.. Istedigim hem web icin hem de sistem yonetimi icin kullanisli ve ogrenmesi kolay olmasi.
Sormak istedigim PHP sistem yonetimi icin uygun bir dil midir?
Biraz PHP Perl karsilastirmasi yapabilir misiniz ?
Tesekkurler..