Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl哈希:当每个循环运行到无止境的循环中时_Perl_Loops_Hash_Each_Infinite Loop - Fatal编程技术网

Perl哈希:当每个循环运行到无止境的循环中时

Perl哈希:当每个循环运行到无止境的循环中时,perl,loops,hash,each,infinite-loop,Perl,Loops,Hash,Each,Infinite Loop,下面的Perl代码运行在一个无休止的循环中。 看起来每个在子例程调用后都会重置自身。 为什么会这样 #!/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]}; } 有趣的是,这是有效的: whi

下面的Perl代码运行在一个无休止的循环中。 看起来每个在子例程调用后都会重置自身。 为什么会这样

#!/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(){
}

通过在列表上下文中对哈希值求值来获取哈希值的内容使用与每个键相同的迭代器,从而使哈希值被重置

最低限度的演示:

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

作为旁注。虽然它们看起来像是在控制子例程接受的内容,但实际上并非如此。它们是关于控制参数的上下文,用途非常有限。如果你不明白,别惹他们。如果你想要子程序参数,请看。谢谢你关于原型的提示。我不知道我是通过编写
()
调用子例程来原型我的子例程的,因为
&foo
告诉Perl忽略原型,这就是为什么您以前可能没有注意到的原因。不需要
&
。看,谢谢你的解释,我突然想到了这一点!问题:你说
每个/key/value
都是迭代器吗?我猜想
每个
都是迭代器,而
是返回列表的函数,除了
每个
之外,不会重置任何迭代器。关于原型——谢谢你的提示,我没有意识到我定义了原型。你认为
keys
如何获得所有的键?它必须迭代元素。它使用相同的迭代器has
每个
@ikegami Klaus的反应都是完全正确的。人们应该感到惊讶的是,
重置了
每个
迭代器。即使它们共享同一迭代器,
也可以还原它。“这是不明显的,也是一个糟糕的设计。”施沃恩假装他的反应与在无法帮助的地方提出批评的反应不同?不酷。如果你所说的是可能的,这不是一个坏主意(尽管void上下文中的键必须继续重置迭代器),那么如果不是补丁,为什么不提交一份错误报告呢。@ikegami我读了你对Klaus的回复,其中带着一个非常含蓄的“怎么可能是其他方式”和“你肯定能找到它”。