我有一个包含数组数组的数组。我试图平行地从每个数组中获取元素。有人能帮帮我吗。
@shuffle= (
[ "george", "jane", "elroy" ],
[ "homer", "marge", "bart" ],
[ "fred", "barney" ]
);
我尝试了这个,但它按顺序迭代内部数组。
my @fh;
#create an array of open filehandles.
@fh = map { @$_ } @shuffle;
foreach (@fh){
my $line = $_;
print $line."\n";
}
out out就像这样:
george
jane
elroy
homer
marge
bart
fred
barney
但我需要这样的输出:
george
homer
fred
jane
marge
barney
elroy
bart
答案 0 :(得分:4)
你需要记住的是当perl做一个阵列数组时。它实际上是一个数组引用数组。
您对map
所做的事情依次取消引用,并通过这样做来展平'你的数组 - 获取第一个数组引用中的所有元素,然后是第二个数据,依此类推。
但那并不是你想要完成的事情 - 你试图从每个中取第一个元素,然后是第二个,然后是第三个等。
但是map语句的作用是允许你计算数组中元素的总数,可以这样使用:
my @shuffle= (
[ "george", "jane", "elroy" ],
[ "homer", "marge", "bart" ],
[ "fred", "barney" ]
);
while ( map { @$_ } @shuffle ) {
foreach my $sub_array ( @shuffle ) {
print shift @$sub_array // '',"\n";
}
}
如果你已经完成了,那可能不是一个理想的测试方法 - 但它确实允许你拥有不同长度的内部数组
答案 1 :(得分:3)
您应该使用List::MoreUtils
模块中的each_arrayref
功能。
代码如下所示:
use strict;
use warnings 'all';
use List::MoreUtils qw/ each_arrayref /;
use Data::Dump;
my @shuffle = (
[ qw/ george jane elroy / ],
[ qw/ homer marge bart / ] ,
[ qw/ fred barney / ],
);
my $iter = each_arrayref @shuffle;
while ( my @set = $iter->() ) {
dd \@set;
}
["george", "homer", "fred"]
["jane", "marge", "barney"]
["elroy", "bart", undef]
答案 2 :(得分:-1)
试试这个
my @shuffle= (
[ "george", "jane", "elroy" ],
[ "homer", "marge", "bart" ],
[ "fred", "barney" ]
);
for my $i(0..$#shuffle)
{
for my $j(0..$#shuffle)
{
print "$shuffle[$j][$i]\n";
}
}