【问题标题】:Perl: Is it possible to iterate over an anonymous hash?Perl:是否可以遍历匿名哈希?
【发布时间】:2017-02-09 16:38:36
【问题描述】:

遍历列表很容易:

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; }没有涉及数组

标签: perl hash foreach anonymous-types


【解决方案1】:

foreach 循环对其表达式求值一次。另一方面,while 每次通过时都会评估其表达式。这意味着您正在反复创建一个新的哈希并获取它的第一个元素。

您可以执行以下操作:

use List::Util 1.29 qw( pairs );

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

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

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 %{...}) 有什么问题吗?不需要use 来代替keys,对吧?
  • @stevesliva,如果你这样做,将无法访问这些值。
  • 哈,是的。我没想过迭代部分!哦,当然,您也希望答案有用
  • @stevesliva,在那种情况下,你考虑过for (1..keys(%{ ... }))吗? :)
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2013-12-30
  • 2016-08-20
  • 2011-10-28
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2012-12-19
相关资源
最近更新 更多