发布
社区首页 >问答首页 >Perl散列: while-each-loop陷入死循环

Perl散列: while-each-loop陷入死循环
EN

Stack Overflow用户
提问于 2012-09-18 11:50:45
回答 1查看 536关注 0票数 2

下面的Perl代码进入了一个无限循环。看起来each在调用子例程后会自动重置。为什么会这样呢?

代码语言:javascript
代码运行次数:0
复制
#!/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]};
}

有趣的是,这是可行的:

代码语言:javascript
代码运行次数:0
复制
while ( my ($x, $y) = each %h ) {
    &do_something( \%h );
}

sub do_something(){
}

而这不是:

代码语言:javascript
代码运行次数:0
复制
while ( my ($x, $y) = each %h ) {
    &do_something( %h );
}

sub do_something(){
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-18 11:52:57

通过在列表上下文中评估散列来获取散列的内容,使用与each/keys/values,相同的迭代器,导致它被重置。

最小演示:

代码语言:javascript
代码运行次数:0
复制
>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忽略它(&)?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12470137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档