哈希中的“语句修饰符”迭代?

时间:2018-09-09 08:22:02

标签: perl loops foreach syntax iterator

我发现自己想要在Perl(v5)中使用语句修饰符形式的哈希值进行迭代:

my %h = (...);
do_something($_[0], $_[1]) for each %h;  ### $_[0] => key, $_[1] => val

或者:

my %h = (...);
my @ary = %h;
do_something($_[0], $_[1]) for splice(@ary, 0, 2);

当然,这些形式都不存在。只是想知道是否有任何工作支持以splice的语句修饰符形式使用eachfor?在Perl 6中,还是通过反向端口,在v5中?

3 个答案:

答案 0 :(得分:2)

List::UtilList::MoreUtils中有一些很棒的功能可以解决这种情况。特别要看一下use List::Util qw{pairs}; do_something($_->[0], $_->[1]) foreach pairs %h;

use List::Util qw{pairmap};

pairmap { do_something($a, $b) } %h;

或者如果您可以在无效的环境中忍受地图:

{{1}}

答案 1 :(得分:2)

最干净的解决方案如下:

do_something($_, $h{$_}) for keys %h;

如果要节省内存,可以照常使用each

{ my ($k, $v);  do_something($k, $v) while ($k, $v) = each(%h); }

当然,如果不使用语句修饰符,它将更加干净。

while (my ($k, $v) = each(%h)) { do_something($k, $v); }

最后,如果您实际上没有处理哈希,可以使用List::Util中的pairs

use List::Util qw( pairs );

do_something(@$_) for pairs %h;

最后一种方法非常浪费,因为它无法有效地创建多个数组。

答案 2 :(得分:0)

您可以缩短

{my ($k, $v);  do_something($k, $v) while ($k, $v) = each(%h); }

do_something($a, $b) while ($a, $b) = each %h;

因为$ a和$ b已经声明要进行排序。