Perl Öğreniyoruz - 1

0
butch
Haydi millet toplanın. Perl öğrenmeye başlıyoruz :) Bundan sonra düzenli olarak bu köşede Can Uğur Ayfer tarafından hazırlanan Perl Öğreniyoruz makaleleri yayınlanacak. Bu makalelerde, klasik yöntemle, basit problemleri adım adım çözerek beraberce Perl öğreneceğiz. Buyrun ilk derse...

(Can Uğur Ayfer, Kim Korkar Unix`den, Perl ve MySQL ile Cgi Programlama gibi kitapların yazarı, 1973 yılından beri ülkemizde bilgisayar sektörünün duayenlerinden birisidir. Halen aktif olarak çalışmakta öğrenmeye, öğretmeye aynı coşku ile devam etmektedir. Kendisine sonsuz teşekkürler)

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/bash
Her 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/bash
satı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.pl
Bildiğ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..

Görüşler

0
anonim
Bu dizi harika bir fikir =)
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..
0
cayfer
Genel scripting uygulamalari icin Perl'in ustunlugu bence tartisilmaz.

PHP web uygulamalari hedeflenerek yazilmis oldugu icin kutuphaneleri de genellikle bu tip islere yonelik.

Perl ogrendiginiz takdirde PHP'yi de buyuk olcude ogrenmis olacaksiniz. Sistem yonetimi icin Perl ile yazilmis o kadar cok arac bulacaksiniz ki, bunlar uzerinde degisiklik yapabilmek icin Perl bilmeye gereksinim duyacaksiniz. Bu nedenle bence once Perl ogrenin.

Web uygulamalarina gelince; PHP bir cok kisiye daha dogal geliyor. ama bana sorarsaniz CGI uygulamalarinda da Perl daha iyi. Belki de ilk goz agrisi oldugu icindir.. :)
0
m1a2
Ellerinize sağlık, serinin devamını bekliyoruz...
0
conan
>Yani;
>
> $ pico prog1.pl
> $ chmod a+x prog1.pl
> $ ./prog1.pl

--$ pico prog1.pl
++$ vi(m) prog1.pl
0
cayfer
Bence de... ama gencler nedense vi(m) ogrenme sabrini gosteremiyorlar. Ne zaman vi ogrenmenin yararlarindan bahsettiysem bosver hoca, kim ugrasacak bunla dediler. Ben de ne yapayim... bari pico kullansinlar dedim.
Notepad kullanmalarindan iyidir :)

Can Ugur Ayfer
0
FZ
Şimdi durduk yerde bana da heves yaptırdınız iyi mi, normalde UNIX ile günlük bir işim yok (en son bitirme ödevimi hazırlarken kullanmıştım). Ama işte zaman zaman geliyor böyle, gittim vimtutor programını çalıştırdım ve yani temel vi(m) komutlarının ne kadar güzel ve pedagojik öğretilebileceği konusunda bir kez daha böyle bir iş çıkaran adamları takdir ettim.

vimtutor dokümanında en çok hoşuma giden şey ise sık sık : ezberlemeyin, okumakla yetinmeyin burada yapın dediğimiz şeyleri yapın ki bu güçlü komut setleri hafızanıza kolaycacık yerleşiversin uyarısı idi ;-) Bilgece bir yaklaşım.

Biraz da nostalji oldu tabii, yıllar önce Sun Microsystem donanımları üzerinde uzmanlaşmış bir ağabeyimizin benim şaşkın ve bitkin halime bakıp 'Ne o Solarisi windows mu zannetin, yok öyle Next, Next, FINISH, yaaa' deyişi geldi :)
0
cayfer
Bir vi ogreniyoruz kosesi hazirlamaya ne dersiniz? Ne guzel olur!
0
conan
Ok ben varim!
0
conan
Simdi oncelikle oldukca uzun ve detayli bir apache dokumani hazirliyorum. Biter bitmez ben de bir vi(m) dokumani hazirlayayim. Ama hemen olabilecegine soz veremiyorum ne yazik ki. Sanirim apache dokumaninin bitmesi bir ayimi alacak. :( yolu yariladim gerci ama kizilderilinin isi belli olmaz !
0
cayfer
Bence hic dert degil. Ne zaman firsatiniz olursa...
0
petkutin
Ugur Hocam saygilar.

benimde bir tuzum olsun isterim corbada. Ben kimmiyim? Onu hem size hem conan''a supriz olsun diye su linke biraktim aciklamasi icin.

http://www.vim.org/features.tr.txt
0
m1a2

echo alias pico=vim>>~/.bashrc&&`tail -1 ~/.bashrc`

Quick-dirty, obfuscated ;)
0
anonim
önce şu vector linux'ları bir kursaydık.. bilgisayara indirdik öyle duruyor. fazlamesai dokümanı bir an önce gelse de bizi kursunlar artık diyorlar. ne oldu ? yoksa vl projesinden vazmı geçildi? bir an önce yardım elinizi bekliyoruz. perl'üde artık linux üzerinde yazarız.. :)
0
anonim

ne gerek var ya 2 satir kodu saymaya

[root@soulfire:~]# cat /etc/passwd | grep /home/ | wc -l

0
cayfer
ne gerek var yaaa 3 komuta

grep /home/ /etc/passwd | wc -l
0
m1a2
:)))
0
conan
AA siz perl filan mi kullaniyorsunuz? bence en iyisi:
less /etc/passwd
Sonra git say kardesim alla alla... sana bosuna mi para veriyorlar sistem yoneticisi diye. Git say... sagda abacus var iste.
0
HoLY
ahahahaha koptummm:)))))
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Perl 20. Doğum Günü ve Perl 5.10 Çıktı

anonim

Geçtiğimiz günlerde Perl'in 20. yaşgünü tüm dünyada coşku ile kutlandı. Doğum gününden 1 gün önce Perl Vakfı Perl 5.10'u duyurdu.

Perl 5.10 da görünen en önemli değişiklik smart match operator. Bir tür karşılaştırma yapmamıza yarayan operatör array içinde aradığımız scalar değeri bulmamızı sağlıyor. Yeni operatörümüz: "~~". Örnek vermek gerekirse $needle scalarimizi array @haystack içinde arıyorsak, kolayca yeni operatörümüzü kullanıyoruz.
if ($needle ~~ @haystack) ...

Sonuç olarak artık Perl'de tüm kaşılaştırmalar doğru şeyi yapmamızı sağlıyor.

Perl Öğreniyoruz - 5

cayfer

1. bölüm 2. bölüm 3. bölüm 4. bölüm
regexp'ler (Regular Expressions)Sözlüğe bakınca
regular: düzenli, muntazam, kurallı, kurallara uygun ve düzenli
expression: deyim, ifade, tabir, anlatım ve dışavurum
karşılıklarını buldum. Bence ingilizce Regular Expression sözcükleri de bu bölümde anlatacağım konuyu tam olarak anlatamıyor; çünkü aslında kavram adını ABD'li matematikçi Kleen'in Düzenli Kümeler Cebiri (Algebra of Regular Sets) üzerindeki çalışmalarından alıyor.

Anti-Spam E-Posta Adresi Oluşturma (Şifreli IP Adresiyle)

FZ

Bugün Perl Rahipleri tapınağında okuduğum ve spam e-posta konusu ile ilgili bu önemli makaleyi ve Perl kodunu sizinle paylaşmak istedim.

Eğer bir şekilde web sayfanızda e-posta adresinizi yayınlamak istiyorsanız yukarıdaki makaledeki Perl betiğini (script) kullanarak oluşturacağınız dinamik bir e-mail adresinin içine o anda sizin e-posta adresinizi çekmeye çalışan robota ya da spamciye dair bilgileri gömebiliyorsunuz. Nasıl yani diyenler okumaya devam edebilir ;-)

Perl programcısı olmaktan gurur duyanlar için özel !

sundance

Perl'ün yaratıcısı Larry Wall, alışageldiğimiz tarzında yaptığı sunumla, 7. geleneksel Perl Soğanının Durumu isimli toplantıda yine herkesi kırdı, geçirdi :)

'Biz, isteksizler,
cahiller tarafından öncülük edilen bir yolda,
imkansızı gerçekleştirmeye çalışıyoruz.
O kadar uzun süredir o kadar çok şeyi, (elimizdeki) o kadar az şeyle gerçekleştirdik ki
Artık (elimizdeki) hiçbir şeyle, herhangibir şeyi yapabilecek hale yetkinliğe eriştik.'

ePerl ile Kolay Internet Programlama

perlci

ePerl modülü ile Perl kodlarini tıpkı ASP ya da PHP gibi HTML dosyalarının içine gömebilirsiniz. Böylelikle daha kolay bir şekilde Perl kullanmış olursunuz. Bu modülü kullanabilmeniz için de tabii ki biraz Perl bilmeniz gerekir.
Daha fazla bilgiyi http://www.eperl.net adresinde bulabilirsiniz.

Editörün Notu: Rıza Çelik'e Perl'e katkılarından ötürü teşekkürler.