我发现自己想要在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
的语句修饰符形式使用each
或for
?在Perl 6中,还是通过反向端口,在v5中?
答案 0 :(得分:2)
List::Util和List::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已经声明要进行排序。