经验法则是使用最适合您需要的功能。
如果您只想要键并且不打算读取任何值,请使用 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()。例如,使用 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