2

下面的 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(){
}
4

1 回答 1

6

通过在列表上下文中评估它来获取哈希的内容使用与each//相同的迭代keysvalues,导致它被重置。

最小演示:

>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 忽略它(&)?

于 2012-09-18T03:52:57.027 回答