Практическое правило - используйте функцию, наиболее подходящую для ваших нужд.
Если вы просто хотите , ключи и не планируют когда - либо читал какой - либо из значений, используйте кнопки ():
foreach my $key (keys %hash) { ... }
Если вам просто нужны значения, используйте values ():
foreach my $val (values %hash) { ... }
Если вам нужны ключи и значения, используйте each ():
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)
Но используя each (), чтобы сделать то же самое:
%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