经验法则是使用最适合您需要的功能。
如果你只是想的钥匙,不打算永远阅读任何值,使用键():
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) { ... }
如果您打算以任何方式更改散列的密钥,除了用于在迭代过程中删除当前密钥,则不得使用each()。例如,该代码以创建一组新的大写键的具有双值工作正常使用箭头键():
%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
请添加一个void-context键%h;在每个循环之前使用迭代器安全地显示。 – ysth 2008-12-01 03:01:38
每个人都有另一个警告。迭代器绑定到散列,而不是上下文,这意味着它不是可重入的。例如,如果循环遍历散列,并且打印散列perl将在内部重置迭代器,从而使该代码无止境地循环: my%hash =(a => 1,b => 2,c => 3); (my($ k,$ v)= each%hash){ print%hash; } 阅读更多在http://blogs.perl.org/users/rurban/2014/04/do-not-use-each.html – Rawler 2014-04-08 09:01:43