La regla general es utilizar la función que mejor se adapte a sus necesidades.
Si solo quiere las claves y no planea leer ninguno de los valores, use keys ():
foreach my $key (keys %hash) { ... }
Si solo desea los valores, use values ():
foreach my $val (values %hash) { ... }
Si necesita las claves y los valores, use cada ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Si planea cambiar las claves del hash de alguna manera, excepto para eliminar la clave actual durante la iteración, entonces no debe usar cada (). Por ejemplo, este código para crear un nuevo conjunto de teclas en mayúsculas con valores duplicados funciona bien usando keys ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
produciendo el hash resultante esperado:
(a => 1, A => 2, b => 2, B => 4)
Pero usando cada () para hacer lo mismo:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
produce resultados incorrectos de formas difíciles de predecir. Por ejemplo:
(a => 1, A => 2, b => 2, B => 8)
Sin embargo, esto es seguro:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
Todo esto se describe en la documentación de perl:
% perldoc -f keys
% perldoc -f each