Perl hash:while-each-loop运行到无限循环

时间:2012-09-18 03:50:45

标签: perl loops hash each infinite-loop

以下Perl代码进入无限循环。 看起来each在子程序调用后会自行重置。 为什么会这样?

#!/usr/bin/perl
use warnings;
use strict;

my %h = ( "a" => "b" );
while ( my ($x, $y) = each %h ) {
    &do_something( \%h );
}

sub do_something(){
    my %tmp  = %{$_[0]};
}

有趣的是,这有效:

while ( my ($x, $y) = each %h ) {
    &do_something( \%h );
}

sub do_something(){
}

虽然这不是:

while ( my ($x, $y) = each %h ) {
    &do_something( %h );
}

sub do_something(){
}

1 个答案:

答案 0 :(得分:5)

通过在列表上下文中评估哈希的内容,使用与each / keys / values相同的迭代器,从而使其重置。

最小示范:

>perl -E"%h=(a=>4); while (($k) = each(%h)) { say $k; keys %h }"
a
a
a
...

>perl -E"%h=(a=>4); while (($k) = each(%h)) { say $k; %t=%h }"
a
a
a
...

由于您只评估第一个和第三个片段中列表上下文中的哈希值,因此只在这两个片段中重置迭代器。


PS - 为什么使用不正确的原型(())然后告诉Perl忽略它(&)?