Perl:如何迭代匿名哈希?

3

遍历列表很容易:

foreach my $elem ( 1, 2, 3, 4, 5 ) {
  say $elem;
}

或者是一个匿名数组:
foreach my $elem (@{[ 1, 2, 3, 4, 5 ]}) {
  say $elem;
}

但是对于匿名哈希表是否也能做到呢?我尝试过:

while (my ($key, $value) = each (%{{ a => 1, b => 2, c => 3 }})) {
  say "$key=$value";
}

但是我遇到了无限循环的问题。


4
与您所说的相反,在foreach my $elem (1, 2, 3, 4, 5) { say $elem; }中没有涉及到数组。 - ikegami
1个回答

12

一个foreach循环只会对其表达式进行一次求值。而while循环则会在每一次迭代时都对其表达式进行求值。这意味着你会重复地创建一个新的哈希,并获取其中的第一个元素。

你可以采用以下方法:

use List::Util 1.29 qw( pairs );

for my $pair ( pairs %{ { a => 1, b => 2, c => 3 } } ) {
   my ( $key, $val ) = @$pair;
   ...
}

但就像您的第二个片段是您第一个片段不必要的浪费和复杂版本一样,上面的内容是以下内容的不必要浪费和复杂版本:

use List::Util 1.29 qw( pairs );

for my $pair ( pairs a => 1, b => 2, c => 3 ) {
   my ( $key, $val ) = @$pair;
   ...
}

foreach my $key (keys %{...}) 这段代码有什么问题吗? keys 不需要使用 use,对吧? - stevesliva
1
@stevesliva,如果你这样做,就无法访问这些值。 - ikegami
哈,是啊。我没有考虑过迭代部分之后的事情!噢,当然,你也希望答案是有用的,对吧? - stevesliva
@stevesliva,如果是这样的话,你考虑过 for (1..keys(%{ ... })) 吗? :) - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接