以下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(){
}
答案 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忽略它(&
)?