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

Arrays 如何使用Perl并行迭代多维数组的内容,arrays,perl,multidimensional-array,Arrays,Perl,Multidimensional Array,我有一个数组,包含数组的个数。我试图并行地从每个数组中获取元素。有人能帮帮我吗 @shuffle= ( [ "george", "jane", "elroy" ], [ "homer", "marge", "bart" ], [ "fred", "barney" ] ); 我尝试了这个,但是它按顺序迭代内部数组 my @fh; #create an array of open filehandles. @fh = map { @$_ } @shuffl

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

@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";

}
输出是这样的:

george
jane
elroy
homer
marge
bart
fred
barney
george
homer 
fred   
jane
marge
barney
elroy
bart
但我需要这样的输出:

george
jane
elroy
homer
marge
bart
fred
barney
george
homer 
fred   
jane
marge
barney
elroy
bart
试试这个

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";
    }   
}
试试这个

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

您应该使用模块中的
每个_arrayref
功能

代码如下所示:

使用严格;
使用“全部”警告;
使用列表::MoreUtils qw/each_arrayref/;
使用数据::转储;
我的@shuffle=(
[qw/george jane elroy/],
[qw/homer marge bart/],
[qw/fred barney/],
);
my$iter=每个_arrayref@shuffle;
而(my@set=$iter->()){
dd\@集;
}
输出
[“乔治”、“荷马”、“弗雷德”]
[“简”、“玛姬”、“巴尼”]
[“埃尔罗伊”,“巴特”,未定义]

您应该使用模块中的
每个\u arrayref
功能

代码如下所示:

使用严格;
使用“全部”警告;
使用列表::MoreUtils qw/each_arrayref/;
使用数据::转储;
我的@shuffle=(
[qw/george jane elroy/],
[qw/homer marge bart/],
[qw/fred barney/],
);
my$iter=每个_arrayref@shuffle;
而(my@set=$iter->()){
dd\@集;
}
输出
[“乔治”、“荷马”、“弗雷德”]
[“简”、“玛姬”、“巴尼”]
[“埃尔罗伊”,“巴特”,未定义]

您需要记住的是,当perl执行“数组数组”时,它实际上是数组引用数组

您使用
映射所做的是依次取消对每个元素的引用,并通过这样做“展平”您的数组-获取第一个数组引用中的所有元素,然后是第二个数组引用,依此类推

但这并不是你想要完成的——你试图从每个元素中提取第一个元素,然后是第二个,然后是第三个,等等

但是map语句所做的是允许您计算数组中的元素总数,因此可以使用:

my @shuffle= (
       [ "george", "jane", "elroy" ],
       [ "homer", "marge", "bart" ],
       [ "fred", "barney" ]
);

while ( map { @$_ } @shuffle ) { 
    foreach my $sub_array ( @shuffle ) { 
       print shift @$sub_array // '',"\n"; 
    }
}

不过,如果您已经完成了测试,那么这可能不是一种理想的方法,但它确实允许您拥有不同长度的内部数组。您需要记住的是,当perl执行“数组数组”时,它实际上是数组引用数组

您使用
映射所做的是依次取消对每个元素的引用,并通过这样做“展平”您的数组-获取第一个数组引用中的所有元素,然后是第二个数组引用,依此类推

但这并不是你想要完成的——你试图从每个元素中提取第一个元素,然后是第二个,然后是第三个,等等

但是map语句所做的是允许您计算数组中的元素总数,因此可以使用:

my @shuffle= (
       [ "george", "jane", "elroy" ],
       [ "homer", "marge", "bart" ],
       [ "fred", "barney" ]
);

while ( map { @$_ } @shuffle ) { 
    foreach my $sub_array ( @shuffle ) { 
       print shift @$sub_array // '',"\n"; 
    }
}

不过,如果您已经完成了测试,那么这可能不是一种理想的方法,但它确实允许您拥有不同长度的内部阵列。您能解释一下您的
打印
语句中
/
的含义吗。我修改了语句,如
print shift@$sub_数组“\n”。它也给出了同样的结果,你为什么实际使用这个。?这背后的原因是什么?这是
定义的
运算符-它的工作原理类似于
|
-这意味着当您尝试移动空数组(最后一个,用于最后一个元素)时,您得到的是
'
而不是
未定义的
。明白了吗。如果不使用此选项,则在使用“使用警告”时会报告警告。感谢您的清晰解释:)“您需要记住的是,当Perl执行“数组数组”时,实际上是数组引用数组”这类内容说了很多,但我认为这是误导。多维数组没有机器级别的表示,并且为Perl必须使用引用而道歉对语言的采用是有害的。C通过要求第二个维度有一个恒定的大小,并在编写
数组[34][56]
时为您执行算术来实现。同样,如果您编写
$array[34][56]
我不认为这是道歉,那么Perl将获取2D数组的正确元素。我发现这是一个更容易理解发生了什么的方法。就这些,接得好。您能解释一下您的
打印
语句中
/
的含义吗。我修改了语句,如
print shift@$sub_数组“\n”。它也给出了同样的结果,你为什么实际使用这个。?这背后的原因是什么?这是
定义的
运算符-它的工作原理类似于
|
-这意味着当您尝试移动空数组(最后一个,用于最后一个元素)时,您得到的是
'
而不是
未定义的
。明白了吗。如果不使用此选项,则在使用“使用警告”时会报告警告。感谢您的清晰解释:)“您需要记住的是,当Perl执行“数组数组”时,实际上是数组引用数组”这类内容说了很多,但我认为这是误导。多维数组没有机器级别的表示,并且为Perl必须使用引用而道歉对语言的采用是有害的。C通过要求第二个维度有一个恒定的大小,并在编写
数组[34][56]
时为您执行算术来实现。同样,如果您编写
$array[34][56]
我不认为这是道歉,那么Perl将获取2D数组的正确元素。我发现这是一个更容易理解发生了什么的方法。这就是全部。