Temel kural, ihtiyaçlarınıza en uygun işlevi kullanmaktır.
Yalnızca anahtarları istiyorsanız ve hiçbir değeri okumayı planlamıyorsanız , keys () kullanın:
foreach my $key (keys %hash) { ... }
Yalnızca değerleri istiyorsanız, değerleri kullanın ():
foreach my $val (values %hash) { ... }
Anahtarlara ve değerlere ihtiyacınız varsa her birini () kullanın:
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Yineleme sırasında mevcut anahtarı silmek dışında herhangi bir şekilde hash anahtarlarını değiştirmeyi planlıyorsanız , each () kullanmamalısınız. Örneğin, değerleri iki katına çıkaran yeni bir büyük harfli anahtarlar kümesi oluşturmak için kullanılan bu kod, () tuşları kullanıldığında iyi çalışır:
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
beklenen sonuç hash'i üretmek:
(a => 1, A => 2, b => 2, B => 4)
Ancak aynı şeyi yapmak için each () kullanmak:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
tahmin edilmesi zor şekillerde yanlış sonuçlar verir. Örneğin:
(a => 1, A => 2, b => 2, B => 8)
Ancak bu güvenlidir:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
Bunların tümü perl belgelerinde açıklanmaktadır:
% perldoc -f keys
% perldoc -f each