Perl Eğitimleri nin bu bölümünde hashleri, Perl dilinin en güçlü özelliklerinden birini öğreneceğiz.

İlişkili dizi, sözlük veya harita olarak adlandırılan hash ler Perl dilinde mevcut veri yapılarından biridir.

Hash sırasız anahtar-değer (key-value) 2'li gruplarından oluşur. Anahtarlar tekil sözcüktür (string). Değerler ise skalardır. Her değer bir rakam, sözcük veya referans olabilir.

Hashler, diğer Perl değişkenleri gibi my anahtar sözcüğü ile tanımlanır. Değişken adının önünde yüzde (%) işareti bulunur.

Bu tanımlama anahtar-değer yapısını hatırlatmada yardımcı olur.

Bazı insanlar hashlerin dizi gibi olduğunu düşünür (eski adı ile 'ilişkisel dizi' bunu ifade eder, ve diğer bazı dillerde, mesela PHP dilinde, dizi ve hash arasında bir fark yoktur.), fakat dizi ve hash arasında iki büyük fark vardır. Diziler sıralıdır ve dizi elemanına rakamsal indeks kullanılarak erişilir. Hashler sırasızdır ve değere string bir anahtar ile erişilir.

Her hash anahtarı (key) bir değer (value) ile ilişkilendirilir ve anahtarlar (key) hash yapısında tekildir. Bunun anlamı tekrar eden anahtar (key) a izin verilmediğidir. (Eğer gerçekten bir anahtar için birden fazla değer olması isteniyorsa, referanslar konusuna geçene kadar bir müddet beklemeniz gerekecek).

Kod üzerinde görelim:

Boş bir hash oluşturma

my %color_of;

Anahtar-değer ikilisini hash e ekleme

Bu örnekte 'apple' anahtar, 'kırmızı' ise ilişkilendirilen değerdir.

$color_of{'apple'} = 'red';

Ayrıca anahtar değeri olarak değişken kullanılabilir, bu durumda tırnak kullanımına gerek yoktur:

my $fruit = 'apple';
$color_of{$fruit} = 'red';

Aslında anahtar basit bir sözcük ise, direkt sözcük kullanılsa bile turnak kaldırılabilir:

$color_of{apple} = 'red';

Yukarıda görüleceği üzere, anahtar-değer ikilisine erişirken, $ işareti kullanılır (% işareti değil) çünkü skalar bir değere erişiyoruz. Anahtar süslü parantez içerisinde yer alır.

Bir hash elemanına erişim

Eleman eklemeye benzer şekilde, bir elemanın değerine erişebiliriz.

print $color_of{apple};

Eğer anahtar hashde bulunmuyorsa, hash tanımsız (undef) sonuç döndürür ve eğer kodda uyarılar (warnings) aktif edilmişse, ön tanımlama yapılmamış değer uyarısı alırız.

print $color_of{orange};

Şimdi daha fazla anahtar-değer içeren hash görelim:

$color_of{orange} = "orange";
$color_of{grape} = "purple";

Değerleri ile birlikte hash tanımlama

Hash tanımı yaparken eş zamanlı olarak anahtar-değer çiftlerini atayabiliriz:

my %color_of = (
    "apple"  => "red",
    "orange" => "orange",
    "grape"  => "purple",
);

=> işareti şişman ok (fat arrow) veya şişman virgül (fat comma) olarak adlandırılır ve eleman çiftlerini gösterir. İlki, yani şişman ok, ince ok (->) tanımını görünce daha anlaşılır olacaktır. Şişman virgül adı bu okların temelde virgül ile aynı olmasından kaynaklanır. Bu nedenle aşağıdaki gibi de yazabilirdik:

my %color_of = (
    "apple",  "red",
    "orange", "orange",
    "grape",  "purple",
);

Aslında şişman ok, kodu daha temiz ve okunabilir yapmak için soldaki elemanın tırnaklarını kaldırmamıza izin verir.

my %color_of = (
    apple  => "red",
    orange => "orange",
    grape  => "purple",
);

Hash elemanına atama yapma

Şimdi var olan bir anahtara başka bir değer atadığımızda ne olduguğunu görelim:

$color_of{apple} = "green";
print $color_of{apple};     # green

Atama işlemi apple ile ilişkilendirilen değeri değiştirdi. Anahtarların tekil ve her bir anahtarın bir değere sahip oldugunu hatırlayalım.

Hash üzerinde işlemler

Bir hashdeki değere erişmek için anahtarı bilmeye ihtiyacımız vardır. Hashin anahtarları ön tanımlı değerler değil ise, keys fonksiyonunu kullanarak anahtar listesini alabiliriz. Daha sonra bu anahtarlar üzerinde işlem yapabiliriz:

my @fruits = keys %color_of;
for my $fruit (@fruits) {
    print "The color of '$fruit' is $color_of{$fruit}\n";
}

@fruits geçici değişkenini bile kullanmaya ihtiyacımız yok, direkt keys fonksiyonundan dönen değerler üzerinde işlem yapabiliriz:

for my $fruit (keys %color_of) {
    print "The color of '$fruit' is $color_of{$fruit}\n";
}

Dizinin boyutu

Dizinin boyutundan bahsettiğimiz zaman, genellikle anahtar-değer çifti sayısını kastederiz. Bu değeri keys fonksiyonunu skalar bağlamda kullanarak elde edebiliriz.

print scalar keys %hash;

Teşekkür

Bu makalenin ilk sürümü Felipe da Veiga Leprevost tarafından yazılmıştır. Kendisi aynı zamanda Perl Maven makalelerinin Portekizce tercüme sini yapmaktadır.