Praktyczną zasadą jest użycie funkcji najlepiej dostosowanej do Twoich potrzeb.
Jeśli chcesz tylko klucze i nie planujesz kiedykolwiek czytać żadnej z wartości, użyj keys ():
foreach my $key (keys %hash) { ... }
Jeśli chcesz tylko wartości, użyj wartości ():
foreach my $val (values %hash) { ... }
Jeśli potrzebujesz kluczy i wartości, użyj each ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Jeśli planujesz zmienić klucze skrótu w jakikolwiek sposób, z wyjątkiem usunięcia bieżącego klucza podczas iteracji, nie możesz używać each (). Na przykład ten kod służący do tworzenia nowego zestawu kluczy z dużymi literami z podwojonymi wartościami działa dobrze przy użyciu keys ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
produkując oczekiwany wynikowy hash:
(a => 1, A => 2, b => 2, B => 4)
Ale używając each () do zrobienia tego samego:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
daje nieprawidłowe wyniki w trudny do przewidzenia sposób. Na przykład:
(a => 1, A => 2, b => 2, B => 8)
Jest to jednak bezpieczne:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
Wszystko to jest opisane w dokumentacji Perla:
% perldoc -f keys
% perldoc -f each