Основное правило - использовать функцию, наиболее подходящую для ваших нужд.
Если вы просто хотите получить ключи и не планируете когда-либо прочитать любое из значений, используйте keys ():
foreach my $key (keys %hash) { ... }
Если вы просто хотите получить значения, используйте values ():
foreach my $val (values %hash) { ... }
Если вам нужны ключи и значений, используйте каждую ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Если вы планируете каким-либо образом изменить ключи хэша , за исключением для удаления текущего ключа во время итерации, вы не должны использовать each (). Например, этот код для создания нового набора ключей в верхнем регистре с удвоенными значениями работает нормально с помощью keys ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
с получением ожидаемого результирующего хэша:
(a => 1, A => 2, b => 2, B => 4)
Но используя каждый () сделать то же самое:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
дает неверные результаты трудно предсказуемым образом. Например:
(a => 1, A => 2, b => 2, B => 8)
Это, однако, безопасно:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
Все это описано в документации perl:
% perldoc -f keys
% perldoc -f each