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