Perl'de hash'lerin dolaşılması için birkaç farklı yol vardır: each ile, anahtarlar listesi (keys) ve foreach ile, ayrıca values ile. Dilin başlangıcından itibaren hash'lerin verilere hızlı erişim için kullanılacağı öngörülmüştür, bu nedenle dolaşım metodları performans ve ek bellek tahsisinin en aza indirilmesi göz önünde bulundurularak oluşturulmuştur.
Problem: Bu teknikleri kullanırken birçok tuzakla karşılaşılabilir: dolaşım esnasında hash'i değiştirmek, iterator'ü hatırlamak, elemanların sırası, each'in hash üzerindeki yan etkisi ve iç içe iterasyonlarda beklenmedik davranış riski.
Çözüm: Güvenli ve öngörülebilir bir iterasyon için foreach my $key (sort keys %hash) kullanılması, dolaşım sırasında hash'i değiştirmemek ve each için yeni döngü öncesi iterator'ü her zaman keys %hash ile sıfırlamak önerilir.
Kod örneği:
my %hash = ( a => 1, b => 2, c => 3 ); foreach my $key (sort keys %hash) { print "$key: $hash{$key} "; # Öngörülebilir sıra }
Anahtar özellikler:
keys ile iterasyon, anahtar listesinin bir kopyasını döndürür, sıra belirli değildir.each iterator'ü hash'e bağlıdır, aynı anda birden fazla döngü yalnızca farklı hash'ler ile mümkündür.each iterator'ünü sıfırlamak için boş bir keys çağrısı kullanılır.each ile dolaşım sırasında hash'i güvenli bir şekilde değiştirmek mümkün mü?
Hayır, bu kontrol edilemeyen sonuçlara yol açar: veriler atlanabilir veya birkaç kez sayılabilir.
İki farklı hash için each çağırılırsa, ortak bir iterator olacak mı?
Hayır, iterator'ler her hash için bağımsızdır.
Aynı hash için iki each döngüsü iç içe yapılabilir mi?
Hayır, iterator "çöker" ve sonuçlar öngörülemez olur. Bu tür durumlar için keys ve iç içe döngüler kullanın.
Her seferinde farklı parçalarla tekrar tekrar çağrılan bir fonksiyonda hash'i dolaşmak için each kullanımı. Iterator çöküyor, bazı veriler kayboluyor.
Artılar:
Eksiler:
Dolaşım için foreach ve keys kullanarak, anahtarların ayrı bir dizide açıkça saklanarak tam bir işleme.
Artılar:
Eksiler: