Kla*_*aus 2 perl hash each loops 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]};
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,这有效:
while ( my ($x, $y) = each %h ) {
&do_something( \%h );
}
sub do_something(){
}
Run Code Online (Sandbox Code Playgroud)
虽然这不是:
while ( my ($x, $y) = each %h ) {
&do_something( %h );
}
sub do_something(){
}
Run Code Online (Sandbox Code Playgroud)
通过在列表上下文中对其进行评估来获取哈希的内容使用与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
...
Run Code Online (Sandbox Code Playgroud)
由于您只评估第一个和第三个片段中列表上下文中的哈希值,因此迭代器仅在这两个片段中重置.
PS - 你为什么使用不正确的原型(())然后告诉Perl忽略它(&)?