A regra é usar a função mais adequada às suas necessidades.
Se você deseja apenas as chaves e não planeja ler nenhum dos valores, use keys ():
foreach my $key (keys %hash) { ... }
Se você quiser apenas os valores, use values ():
foreach my $val (values %hash) { ... }
Se você precisar das chaves e dos valores, use each ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Se você planeja alterar as chaves do hash de qualquer forma, exceto para excluir a chave atual durante a iteração, você não deve usar each (). Por exemplo, este código para criar um novo conjunto de chaves maiúsculas com valores duplicados funciona bem usando keys ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
produzindo o hash resultante esperado:
(a => 1, A => 2, b => 2, B => 4)
Mas usando each () para fazer a mesma coisa:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
produz resultados incorretos de maneiras difíceis de prever. Por exemplo:
(a => 1, A => 2, b => 2, B => 8)
Isso, no entanto, é seguro:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
Tudo isso é descrito na documentação do perl:
% perldoc -f keys
% perldoc -f each