La regola pratica è utilizzare la funzione più adatta alle proprie esigenze.
Se vuoi solo le chiavi e non prevedi di leggere mai nessuno dei valori, usa keys ():
foreach my $key (keys %hash) { ... }
Se vuoi solo i valori, usa values ():
foreach my $val (values %hash) { ... }
Se hai bisogno delle chiavi e dei valori, usa each ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Se si prevede di modificare le chiavi dell'hash in qualsiasi modo tranne che per eliminare la chiave corrente durante l'iterazione, non è necessario utilizzare each (). Ad esempio, questo codice per creare un nuovo set di chiavi maiuscole con valori raddoppiati funziona bene usando keys ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
producendo l'hash risultante previsto:
(a => 1, A => 2, b => 2, B => 4)
Ma usando each () per fare la stessa cosa:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
produce risultati errati in modi difficili da prevedere. Per esempio:
(a => 1, A => 2, b => 2, B => 8)
Questo, tuttavia, è sicuro:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
Tutto questo è descritto nella documentazione di perl:
% perldoc -f keys
% perldoc -f each