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 pas de jamais lire l'une des valeurs, utilisez keys() :
foreach my $key (keys %hash) { ... }
Si vous voulez seulement les valeurs, utilisez values() :
foreach my $val (values %hash) { ... }
Si vous avez besoin des clés et les 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 prévoyez de modifier les clés du hachage de quelque façon que ce soit sauf pour effacer la clé courante pendant l'itération, alors vous ne devez pas utiliser each(). Par exemple, ce code pour créer un nouvel ensemble de clés en majuscules avec des valeurs doublées fonctionne bien en utilisant keys() :
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
produisant le résultat attendu du hachage :
(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 ceci est décrit dans la documentation de perl :
% perldoc -f keys
% perldoc -f each