我在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
....
那里发生了什么?我的代码出了什么问题?
答案 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