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数组的正确元素。我发现这是一个更容易理解发生了什么的方法。这就是全部。