İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

BİLEŞİK DİZİLER

Giriş

Bu diziler normal dizilerde,dizi elemanlarının bilinememesi ihtiyacını karşılamak amacıyla tanımlanmışlardır.

Örneğin : @dizi dizisinin 1.elemanı $dizi[1] dir ve içeriğini bilmek ise zordur. Oysa ki bileşik dizilerde elemanda bulunan değerin kendisi indistir. $dizi[1] içeriği muz değerini taşıyor olabilir ve bu değeri dışardan anlamak zordur. Bileşik dizide ise $dizi{"muz"} gösterimi vardır. Yani değer indistir. Bu da bir çok kolaylığı beraberinde sunar.

Öncelikle bileşik dizilerin tanımından başlayalım. Normal dizi tanımında dizi değişkeni adının başında @ karakteri vardı(@meyvalar ...gibi). Bileşik dizi değişkeninin başındaki karakter ise % karakteridir. Bir meyvalar isimli bileşik dizi tanımlayacak olursak, %meyvalar şeklinde kodlarız. Bir diğer fark ise normal dizilerde indis [] karakterleri içinde ifade edilirken bileşik dizilerde { } karakterleri içinde gösterilir. İndiste kullanılacak değerler skalar değer ve değişken adları olabilir.

     $personel_sicil{14159}

     $meyva{"kara_yemis"}

     $reel{3.14159}

     $tamsayi{-7}

     $meyva{$meyva_adi}   

yukarıdaki örneklerin hepsi geçerlidir ve bizlere büyük bir kullanım kolaylığı sağlar.

BİLEŞİK DİZİLERE ELEMAN ATAMA VE EKLEME

Atama şekli normalde aşağıdaki gibidir.

$meyva{"elma"} = 1;

burada %meyva bileşik dizisinin elma elemanına 1 değeri atanıyor.

Örnek Program : Ekrandan meyva adı ve numarası girelim(nar mutlaka olsun). Enter basınca nar adlı meyvanın numarasını bassın. Adı ass1.pl

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/bin/perl

  $girilen = <STDIN>;

  $girilen =~ s/^\s+|\s+\n$//g;

  %meyva = split(/\s+/, $girilen);

  print ("Nar numarası: $meyva{\"nar\"}\n");

Çalışması:

>ass1.pl

elma 1  armut 2 nar 3       ayva 4

Nar numarası: 3

>

Bir başka örnek program : Bu program da ekrandan girilen satırlarda bulunan büyük harfle başlayan kelimeler ve adetleri bulunur ve basılır. Program adı : ass2.pl

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl

while ($girilensatır = <STDIN>) {

       while ($girilensatır =~ /\b[A-Z]\S+/g) {

           $kelime = $&;

           $kelime =~ s/[;.,:-]$//;  # noktalamalar siliniyor.

           $kelimelistesi{$kelime} += 1;

          }

  }

print ("Buyuk harfli kelimeler ve sayıları:\n");

foreach $buyukharfli (keys(%kelimelistesi)) {

        print ("$buyukharfli: $kelimelistesi{$buyukharfli}\n");

       }

Çalışması :

>ass2.pl

     Bu bir Giris satırıdır.

     Bu satırlarda Buyuk harfler vardır.

     ^D

     Buyuk harfli kelimeler ve sayıları:

     Bu: 2

     Giris: 1

     Buyuk: 1
>

BİLEŞİK DİZİLERİ OLUŞTURMA

Bu diziler tek bir atama ile oluşturulabilir ve daha sonra eleman ilavesi yapılabilir.

%meyvalar = ("elmalar", 17, "narlar", 9, "incirler", "yok");

[ veya perl5 e ait bir atama özelliği olarak

%meyvalar = ("elmalar" => 17, "narlar" => 9,

           "incirler" => "yok");  ]

komutuyla oluşturulan bileşik dizinin index elemanları ve onların değerleri

elmalar, 17,

narlar, 9,

incirler,yok

şeklindedir

%meyvalar dizisine daha sonra elemanı eklemek istersek, mesela, $meyvalar{"kiraz"} = 5; kodunu gireriz.Bu kodlama ile meyvalar isimli bileşik diziye, yeni bir eleman (indexi kiraz ve buradaki değer olarak ta 5) atanmış olur. Normal dizilerden de bileşik dizi oluşturabiliriz. Örneğin,

@meyvalar = ("elmalar", 6, "kirazlar", 8, "muzlar", 11);

%meyvalar = @meyvalar;

satırları incelendiğinde bu işlemin nasıl gerçekleştiği anlaşılacaktır. Benzer mantıkla bileşik diziden de bileşik dizi oluşturulabilir.

%meyvalar2 = %meyvalar1;

ve pek kullanışlı olmamakla birlikte(dizi elemanlarının sırası belirlenmediğinden), bileşik diziden de normal dizi oluşturulabilir.

%meyvalar = ("elmalar", 6, "kirazlar", 8, "muzlar", 11);

@meyvalar = %meyvalar;

hatta aynı anda diziler ve skalar değişkenlere birlikte de atama yapılabilir.($degisken1, $degisken2, %bilesikdizi) = @dizi; ...gibi.. yukarda @dizi nin 1.elemanı $degisken1, 2. elemanı ise $degisken2,ye atanır. Sonraki elemanlar ise %bilesikdizi ye atanırlar.

Örnek Program : Program girilen satırı split fonksiyonu ile bölerek bileşik dizi oluşturur. Program Adı:ass3.pl

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl

 $girilensatir = <STDIN>; #satır girişi:
(meyva adı ve değeri şeklinde)

 $girilensatir =~ s/^\s+|\s+\n$//g; #baştaki ve sondaki boşluklar ayıklanır

 %meyva = split(/\s+/, $girilensatir); #satır kelimelere bölünüp,diziye 

                                       #elemanlar olarak atanır

 print ("Muz sayısı: $meyva{\"Muz\"}\n");

Çalışması :

>ass3.pl

    Nar 5 Elma 7 Muz 11 Kiraz 6

    Muz sayısı: 11

>

Diziye eleman eklemeyi görmüştük.Bu dizilerden eleman silmek için TEK YOL hazır fonksiyon olan delete kullanımıdır.(Bazı fonksiyonlar çeşitli silme işlemleri yaparlar ama bazı durumlarda karışıklığa yol açılabilir) Ör:

delete($meyva{"Muz"}); 

satırı ile %meyva bileşik dizisinden Muz elemanı(indexi) silinir.

DİZİ İNDEXLERİNİ VE DEĞERLERİNİ LİSTELEME

Bileşik dizilerin indexlerini keys fonksiyonu elde eder.

%meyva = ("nar", 9,

          "muz", 23,

          "ayva", 11);

   @meyvaindex = keys(%meyva);

Yukardaki şekilde kodlanan satırların sonucu olarak,keys hazır fonksiyonu,%meyva bileşik dizisinin indexleri olan nar,muz ve ayva yı @meyvaindex dizisine atar. Bu atamayı alfabetik sırada yapmak istersek sort fonksiyonunu da eklememiz gerekir Ör:

@meyvaindex = sort keys(%meyva);

Bileşik dizilerin indexlerini keys fonksiyonu elde eder demiştik değerlerini ise values hazır fonksiyonuyla elde ederiz.

%meyva = ("nar", 9,

          "muz", 23,

          "ayva", 11);

    @meyvaindex = values(%meyva);

@meyvaindex dizisinin elemanları; (9, 23, 11) dir.

Bir Bileşik dizinin elemanlarına döngü şeklinde erişim (tüm elemanlarına sırayla erişim). Bu işlem için daha önce gördüğümüz keys ve foreach kullanılabileceği gibi, each hazır fonksiyonuda kullanılabilir. Örnek:

%kayit = ("Mavis", 16, "Arif", 27, "Dinc", 51);

    foreach $tut (keys(%kayit)) {
          .
          .
          .
        # sonraki satırlar 
    }

Arif, Mavis, ve Dinc ,$tut değişkenine atanırlar.

Bu yöntemle indexlere erişildi ama değerlere erişemedik. Değerlere erişim için de yine aynı mantıkla yeni bir foreach döngüsü kullanmamız gerekir. Ama perl bu kullanımın yerine işimizi çok daha kolaylaştıracak olan each fonksiyonuna sahiptir. Bu fonksiyonla hem index hem değeri elde etmek mümkündür. Ör:

%kayitlar = ("Mavis", 16, "Arif", 27, "Dinc", 51);

    while (($tut, $kayit) = each(%kayitlar)) {

            # satırların devamı

    }

yukarda ilk satırda index ve değerler den oluşan bileşik dizi elemanları,diziyi oluştururlarken while döngüsünün her dönüşünde bu diziye ait index ve değer çifti skalar değişkenlere atanır. $tut, indexi, $kayit ise değeri alır. (ilk dönüşte bunların değerleri Mavis ve 16 dır. Sonraki dönüşlerde aynı kurala göre işler).

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır