Perl:可以在匿名散列上迭代吗?

Perl:可以在匿名散列上迭代吗?,perl,hash,foreach,anonymous-types,Perl,Hash,Foreach,Anonymous Types,迭代列表非常简单: 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 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循环对其表达式求值一次<另一方面,code>而,则在每次传递时对其表达式求值一次。这意味着您要重复创建一个新的哈希并获取它的第一个元素

您可以执行以下操作:

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;
   ...
}
但正如您的第二个代码段是第一个代码段的不必要的浪费和复杂版本一样,上面的代码段也是以下代码的不必要的浪费和复杂版本:

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$elem(1,2,3,4,5){say$elem;}
中没有涉及任何数组,如果您认为
foreach my$key(keys%{…})
有任何错误,则无需
键使用
,对吗?@stevesliva,如果您这样做,就无法访问值。哈,是的。我没有考虑过迭代部分!哦,当然,你也希望答案有用吗?@stevesliva,在这种情况下,你考虑过(1..keys(%{…}))的
?:)