如何使用Perl并行迭代多维数组的内容

时间:2015-12-30 11:53:48

标签: arrays perl multidimensional-array

我有一个包含数组数组的数组。我试图平行地从每个数组中获取元素。有人能帮帮我吗。

@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

3 个答案:

答案 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";
    }   
}