下面的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(){
}
发布于 2012-09-18 03:52:57
通过在列表上下文中评估散列来获取散列的内容,使用与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忽略它(&
)?
https://stackoverflow.com/questions/12470137
复制