这篇文章的最佳答案:How can I create a multidimensional array in Perl?建议按如下方式构建一个多维数组:
my @array = ();
foreach my $i ( 0 .. 10 ) {
foreach my $j ( 0 .. 10 ) {
push @{ $array[$i] }, $j;
}
}
我想知道是否有一种方法可以更紧凑地构建阵列并避免嵌套循环,例如:使用类似的东西:
my @array = ();
my @other_array = (0 ... 10);
foreach my $i ( 0 .. 10 ) {
$array[$i] = @other_array; # This does not work in Perl
}
}
Perl是否支持任何类似构建多维数组的语法而没有嵌套循环?
同样,有没有办法在没有(嵌套)循环的情况下打印多维数组?
答案 0 :(得分:7)
有多种方法可以做到:
push
接受LIST
s
my @array;
push @{$array[$_]}, 0 .. 10 for 0 .. 10;
替代语法:
my @array;
push @array, [ 0 .. 10 ] for 0 .. 10;
map
目击者
my @array = map { [ 0 .. 10 ] } 0 .. 10;
替代语法:
my @array = map [ 0 .. 10 ], 0 .. 10;
循环次数最少
print "@$_\n" for @array;
在Perl 5.10 +
上use feature 'say';
say "@$_" for @array;
使用更多格式控制
print join( ', ', @$_ ), "\n" for @array; # "0, 1, 2, ... 9, 10"
“没有循环”(循环对你隐藏)
use Data::Dump 'dd';
dd @array;
<强> Data::Dumper
强>
use Data::Dumper;
print Dumper \@array;
有关详细信息,请查看perldoc perllol
答案 1 :(得分:2)
你很接近,你需要引用另一个数组
my @array; # don't need the empty list
my @other_array = (0 ... 10);
foreach my $i ( 0 .. 10 ) {
$array[$i] = \@other_array;
# or without a connection to the original
$array[$i] = [ @other_array ];
# or for a slice
$array[$i] = [ @other_array[1..$#other_array] ];
}
}
您还可以使用方括号[]
围绕列表直接创建匿名(未命名)数组引用。
my @array;
foreach my $i ( 0 .. 10 ) {
$array[$i] = [0..10];
}
}
编辑:使用后缀for
print "@$_\n" for @array;
对于数值多维数组,您可以使用PDL
。它有几个用于不同用例的构造函数。与上述类似的是xvals
。请注意,PDL对象会超载打印,因此您只需打印它们即可。
use PDL;
my $pdl = xvals(11, 11);
print $pdl;