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

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)

ike*_*ami 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
...
Run Code Online (Sandbox Code Playgroud)

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


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