Perl Öğreniyoruz - 3

0
cayfer
2. bölümün sonunda bu hafta "listeler"den söz edeceğimi söylemiştim.

Listeler (arrays) Perl'in çok güçlü olduğu konulardan birisidir. Perl'de bir listeden söz ederken değişken adının başına bir @ işareti koymalısınız. (Hatırlıyorsanız sayıl (scalar) değişkenlerin adı $ işareti ile başlardı).

Örneğin @aylar isimli bir değişken adı görür görmez hem siz hem de Perl yorumlayıcısı, bir listeden söz edildiğini anlamalısınız.

Listeler sıfırdan başlayan indekslerle adreslenir. Yani, bir listenin ilk elemanından söz ederken @liste[0], üçüncü elemanından söz ederken ise @liste[2] kullanılır.

Bir başka önemli konu da şu: bir listenin üçüncü elemanından söz ettiğinizde, aslında bir sayıl'dan söz ediyorsunuz. Bu nedenle bir çok eski Perl programcısı, örneğin @aylar listesinin ikinci elemanından söz ederken @aylar[1] yerine $aylar[1] yazar. Doğrusu da aslında bu ama şimdi hatırlayamadığım bir sürümden sonrası Perl yorumlayıcılarında her iki notasyon da kullanılabilmektedir. Benim önerim liste elemanlarında söz ederken $ notasyonunu kullanmanızdır.

Listelerin deklare edilmesi isteğe bağlıdır. Bir listeyi deklare etmek istediğinizde (ya da use strict; kullandığınızda mecbur olduğunuz için)

    my @aylar;
yazmanız yeterlidir. Dikkat ederseniz listenin kapasitesi, yani içine alabileceği eleman sayısı hakkında bir bilgi deklare etmeye gerek yok. Yani "Dimension" belirtmeye gerek yok.

Perl'de bir listeye bilgisayarınızın belleğinin izin verdiği kadar eleman tıkalayabilirsiniz. Elemanları yerleştirirken indekslerin ardışık olması da gerekmez.

Örneğin:

    $aylar[0] = "Ocak";
    $aylar[1] = "Şubat";
    $aylar[3] = "Nisan";
veya
    @aylar = ("Ocak", "Şubat", undef, "Nisan");
komutlarından sonra @aylar listesinin üçüncü elemanı tanımsız olacak ve değeri undef olacaktır ama @aylar listesi kusursuz bir şekilde tanımlı olacaktır.

Şimdi sıkı durun! Perl'de bir listenin elemanlarının hepsinin aynı tipte olması gerekmez. Aslında zaten Perl'de "tip" diye bir kavram da yok.

Yani bir listeyi doldururken

    $aylar[0] = "Ocak";
    $aylar[1] = 31;
    $aylar[2] = ("Şubat", 20000, "işte öyle bir şey", -123.456);
gibi değişik tipte değerler kullanabilirsiniz. Hatta yukardaki örnekte göreceğiniz gibi listenin bir elemanı bir başka liste bile olabilir.

Listelerle uğraşmış programcılar bilirler: en çok lazım olan değerlerden biri bir listenin eleman sayısıdır. Perl'de bir listenin eleman sayısını bulmak biraz garip gelecek şimdi size!

    @aylar = ("Ocak", "Şubat", "Mart", "Nisan");
    $n = @aylar;
deyimlerinden sonra @aylar dört elemanlı bir liste, $n değişkeninin değeri de 4 olacaktır. Perl'de bir listeyi olduğu gibi bir sayıl değişkene atarsanız, sayıl değişkene listenin eleman sayısı atanmış olur. Bir listenin kopyası lazım olduğunda bir döngü kurup elemanları teker teker kopyalamanız gerekmez.
    @kopyasi = @aylar;
gibi bir deyim iş görür.

Perl'de bir listeye eleman eklemek istediğinizde ilk boş indeksin kaç olduğunu bilmenize gerek yoktur. Listenin sonuna eleman eklemek istediğinizde

    @liste = (1, 2, 3, 4);
    push(@liste, "A");
    print "@liste
";
yapısını kullanabilirsiniz. Yukardaki örnekte push deyiminden sonra @liste listesi (1, 2, 3, 4, "A") olacaktrır.

Bir listenin başına eleman eklemek istediğinizde

    @liste = (1, 2, 3, 4);
    unshift(@liste, "A");
    print "@liste
";
yapısını kullanabilirsiniz. Yukardaki örnekte unshift deyiminden sonra @liste listesi ("A", 1, 2, 3, 4) olacaktrır.

Bu push ve unshift fonksiyonları, pop ve shift fonksiyonlarının da olması gerektiğini gösteriyor, değil mi?

pop fonksiyonu bir listenin sonundaki elemanı çekip almak için; shift fonksiyonu da başındaki elemanı çekip almak için kullanılır.

Örneğin:

    @liste = (1, 2, 3, 4, 5);
    $son = pop(@liste);
den sonra $son değişkenin değeri 5 olacak ve @liste listesi de (1, 2, 3, 4) kalacaktır.

Benzeri şekilde

    @liste = (1, 2, 3, 4, 5);
    $ilk = shift(@liste);
den sonra $ilk değişkenin değeri 1 olacak ve @liste listesi de (2, 3, 4, 5) kalacaktır.

Deneyimli okuyucular bu push-pop ve shift-unshift fonksiyonlarının yığıt (stack) ve kuyruk (queue) modellemesinde ne denli kolaylık sağlayacağını farketmiştir sanırım.

Kod yazarken çok sık karşılaşacağınız bir işlem dizisi de bir listedeki tüm elemanlar için tekrarlanması gereken işlemler olacaktır. Yani:

    print "Listenin elemanları:
";
    $n = @liste;
    for ($i=0, $i < n, $i++) {
        print "$liste[i]
";
    }
gibi birşeylerden söz ediyorum.

Yukardaki kodu Perl'de aynen kullanabilirsiniz ama bu Perlce olmaz. Ben olsam aynı işi

    print "Listenin elemanları:
";
    foreach $eleman ( @liste ) {
       print "$eleman
";
    }
hatta
    print "Listenin elemanları:
";
    foreach ( @liste ) {
       print;
    }
diye yazardım.

foreach $sayil ( @liste ) { ... } deyim yapısı "@liste listesinin elemanlarını sırayla $sayil değişkenine yerleştir ve { ...} arasındaki kodu her eleman için tekrarla" diye okunabilir.

Bir sonraki "foreach ( @liste ) { ... }" yapısı ise "@liste listesinin tüm elemanları için tekrarla, her seferinde seçilen eleman $_ değişkeninde olsun!" diye okunabilir.

Bu ikinci formda, print deyiminde neyin print edileceğini söylemediğimiz için $_ sistem değişkeninin içeriği basılacaktır.

Vurucu darbeyi de indirip bu haftalık bitireyim:

    open (D, "/tmp/plakalar");
    @araclar = ;
    @sirali = sort(@araclar);
    @ters_sirali = reverse(@sirali);
    print @ters_sirali;
    print "
";
Bu kod "/tmp/plakalar" dosyasını açıyor, dosya tanımlayıcısı bir listeye atandığı için dosyadaki satırlarının her biri bir liste elemanı olacak şekilde @araclar listesini dolduruyor. @araclar listesini alfabetik olarak sıralayıp @sirali listesini oluşturuyor. Son olarak da @sirali listesini ters çevirip @ters_sirali listesini oluşturuyor.

Yukardaki işleri

    open (D, "/tmp/plakalar");
    print reverse(sort());
    print "
";
koduyla da yapabilirdik elbette.

Haftaya çağrışımlı listelerde buluşmak üzere...

Görüşler

0
elrond
Malesef ne zamandır Fazla mesami ayırıpta buraya bağlanamıyordum. Yukarı daki gibi bir yazı görünce gerçekten çok heyecanlandım. Eline ayağına sağlık `cayfer` ne diyim.
0
petkutin
Ugur hocam,

sanirsam kod ornekleriniz HTML''in gazabina ugramis. tarayiciya(IE) hic basilmiyor, HTML kodunda olmasina ragmen. Galiba dogru basilmis hali soyle olacak:


open (D, /tmp/plakalar);
@araclar = ;
@sirali = sort(@araclar);
@ters_sirali = reverse(@sirali);
print @ters_sirali;
print  ;

---------

open (D, /tmp/plakalar);
print reverse(sort());
print  ;

saygilar...

0
petkutin
hoppala...benimkileride yuttu. halbuki Onizleme sirasinda hersey gayet guzel gozukuyordu. Onizleme ile Gonderilen yorum arasinda bir fark olmamasi lazim, hele Eski Duz Yazi gonderirken hic yapmamasi lazim... <D>
0
petkutin
bir kez daha deniyorum...

open (D, /tmp/plakalar);
@araclar = <D> ;
@sirali = sort(@araclar);
@ters_sirali = reverse(@sirali);
print @ters_sirali;
print   ;

---------

open (D, /tmp/plakalar);
print reverse(sort(<D>));
print  ;


0
cayfer
Uyariniz ve duzeltme icin tesekkurler.

Ugur
Görüş belirtmek için giriş yapın...

İlgili Yazılar

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 Öğreniyoruz - 1

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)

Windows için ideal Perl ortamı

sundance

Uzun zamandır Perl için Windows ortamında güzel bir Entegre Yazılım Geliştirme ortamı arıyordum, sonunda buldum Open Perl Ide

Gerek debug özellikleri ile gerekse editörünün sağladığı kolaylıklar ile gerçekten dört dörtlük bir Perl geliştirme ortamı, herkese tavsiye ederim.

Nokia Cep Telefonlarını Perl ile Programlayın

FZ

Meşhur cep telefonu üreticisi Nokia, Series 60 cihazlarının Perl ile programlanabilmesi için gerekli çalışmayı başlattığını açıkladı.

Sanırım artık ciddi ciddi cep telefonu programlamayı düşünmekte fayda var, nihayet bu aletleri programlamak ``eğlenceli´´ hale gelmek üzere ;-)

Kaynaklar:

- http://slashdot.org/article.pl?sid=04/01/17/1435206

- http://theregister.co.uk/content/64/34943.html

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 ;-)