Perl:是否可以迭代匿名哈希?

Perl: Is it possible to iterate over an anonymous hash?

迭代列表很容易:

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";
}

但是我得到了一个无限循环。

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;
   ...
}