0

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

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

4

2 回答 2

7

有不止一种方法可以做到:

生成

push接受LIST_

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更多详细信息

于 2012-09-12T16:09:03.973 回答
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;
于 2012-09-12T15:59:03.963 回答