嵌套循环通过哈希:无限循环

时间:2014-10-23 20:28:35

标签: perl

我在Perl中遇到了一个“奇怪”的问题。我已经定义了一个简单的哈希:

my %h = (
  one => 'this is my first value',
  two => 'and this is the second',
);

我试图在each循环中使用while来迭代它:

while (my ($key, $val) = each %h) {
  print "$key, $val\n";  
}

非常简单,而且效果非常好。

然后我需要再次遍历相同的哈希,所以我添加了一个嵌套的while..each,如下所示:

while (my ($key, $val) = each %h) {
    while (my ($key2, $val2) = each %h) {
      print "$key - $key2\n";  
    }
}

我希望它只返回四行,但我得到一个无限循环:

one - two
one - two
one - two
one - two
....

那里发生了什么?我的代码出了什么问题?

1 个答案:

答案 0 :(得分:3)

同一个哈希上的那些each命令将共享一个迭代器,因此您将不会获得嵌套的迭代行为。 (阅读文档的第3段

相反,外部循环将以第一个键/值对开始,但是内部循环将继续第二个键,直到它到达结尾,此时共享迭代器将被重置。然后外部循环将从头开始,再次创建无限循环。

要在同一个哈希上完成嵌套迭代器,您需要使用keys代替:

use strict;
use warnings;

my %h = (
    one => 'this is my first value',
    two => 'and this is the second',
);

for my $key ( keys %h ) {
    for my $key2 ( keys %h ) {
        print "$key - $key2\n";
    }
}

输出:

one - one
one - two
two - one
two - two