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

Visual Perl, Visual Python

gencbeyin

Microsoft Visual Studio .NET için editör, grafik arındırıcı, dil deyimleri (regular expression) kontrolü ve XML Web servisleri programlama gibi özellikleri bulunan Visual Perl ve Visual Python 22.Ekim'de Los Angeles'da Active State'in kurucusu Dick Hardt tarafından Microsoft Professional Developers Conference'da ilan edildi. Yazıldıktan sonra her türlü platformda kullanılabilecek türden kod oluşturan geliştirme ortamı ilk üçüncü parti programlama dili paketi olarak nitelendirildi.

Perl Öğreniyoruz - 4

cayfer

Daha önceki bölümler:
1. bölüm
2. bölüm
3. bölüm
Bu hafta konumuzda çağrışımlı listeler var, Haftaya "regexp"ler! Bu arada merak ettiğim birşey var: Acaba bu Perl tefrikasından yararlanan var mı?

Perl, Divx, altyazı ve başının çaresine bakabilmek üzerine

sundance

Uzun zamandır izlemek istediğim, The Hustler'ı seyretmek için sonunda zaman bulabildim. Paul Newman'ın 1962'de başrolünü oynadığı bu film, yıllar sonra Color of Money'e de konu olacak Fast Eddie Felson'ın hikayesini anlatıyordu. Dahası Unix Junkie makalemde bahsettiğim insan modelinin belki de en iyi örneklerinden biriydi.

Fakat küçük bir problem vardı, filmindeki hiçbir dialoğu kaçırmamak için altyazıya ihtiyaç duyuyordum, fakat benim elimdeki film iki cd olmasına rağmen bulabildiğim yegane ingilizce altyazı üç cdlikti.

Durumdan vazife çıkartmaya zaten hazır bir FM sakini olarak, sıvadım kolları ve küçük bir perl betiki yazdım bu işi yapması için. Film hatırladığımdan bile güzeldi, ama böyle bir durumda bir beş, on dakika içinde problemi çözebilmek daha bile keyifliydi, GNU/Linux kullanıyor olmak keyifliydi :)

Perl // Küçük Regexp El Kitabı

Ansugo

Çok fazla kod yazıyor, ama bazı yerlerde tıkandığınızı hissediyorsunuz; == ile karşılaştırma yapabiliyor, ama string içinde arama yapmakta istiyorsunuz; ve en güzeli herhangi bir stringin altindan cikip cikmak istiyorsunuz, o zaman buyurun düzenli ifade cumhuriyetine.

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.'