BİLEŞİK DİZİLER
 
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
 
#!/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
 
#!/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.
%meyvalar1 = ("elmalar", 6, "kirazlar", 8, "muzlar", 11);
%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
 
 #!/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).