La règle de base est d'utiliser la fonction la plus adaptée à vos besoins.
Si vous voulez juste les clés et ne prévoyez jamais de lire aucune des valeurs, utilisez keys ():
foreach my $key (keys %hash) { ... }
Si vous voulez juste les valeurs, utilisez values ():
foreach my $val (values %hash) { ... }
Si vous avez besoin des clés et des valeurs, utilisez each ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Si vous envisagez de modifier les clés du hachage de quelque manière que ce soit, sauf pour supprimer la clé actuelle pendant l'itération, vous ne devez pas utiliser each (). Par exemple, ce code pour créer un nouvel ensemble de clés majuscules avec des valeurs doublées fonctionne très bien en utilisant keys ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
produire le hachage résultant attendu:
(a => 1, A => 2, b => 2, B => 4)
Mais en utilisant each () pour faire la même chose:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
produit des résultats incorrects de manière difficile à prévoir. Par exemple:
(a => 1, A => 2, b => 2, B => 8)
Ceci, cependant, est sûr:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
Tout cela est décrit dans la documentation perl:
% perldoc -f keys
% perldoc -f each