迭代列表很容易:
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";
}
但是我得到了一个无限循环。
答案 0 :(得分: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;
...
}