経験則としては、ニーズに最も適した機能を使用することです。
キーだけが必要で、値を読み取る予定がない場合は、keys() を使用します。
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() を使用しないでください。たとえば、2 倍の値を持つ大文字のキーの新しいセットを作成する次のコードは、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