在Perl中构建和打印多维列表而不进行循环

时间:2012-09-12 15:57:22

标签: perl multidimensional-array

这篇文章的最佳答案: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是否支持任何类似构建多维数组的语法而没有嵌套循环?

同样,有没有办法在没有(嵌套)循环的情况下打印多维数组?

2 个答案:

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