2D 阵列打印作为参考

sfr*_*sfr 1 arrays perl multidimensional-array

我有类似于下面的代码:

my @array1 = (); #2d array to be used
my $string1 = "blank1";
my $string2 = "blank2";
my $string3 = "blank3";

my @temp = ($string1, $string2, $string3);
push (@array1, \@temp);
Run Code Online (Sandbox Code Playgroud)

我分配字符串然后将它们放入数组的原因是因为它们位于循环中并且值在循环中更新(@array1 未在循环中声明)。

当我运行程序时,它只提供对数组的引用,而不是实际的二维数组。如何让它将内容打印为二维数组,而不是作为参考或展平为一维数组?

我想要一个像这样的输出[[blank1, blank2, blank3],....],这样我就可以像这样访问它$array1[i][j]

zdi*_*dim 5

数组只能有元素标量。因此,这包括对数组的引用,例如数组,这使我们能够构建复杂的数据结构。请参阅perldscTom 的 Perl 数据结构手册

这些(“第二级”)数组的元素可通过取消引用来访问,$array1[0]->[1]数组的第二个元素也是如此,其引用是顶级数组 ( @array1) 的第一个元素。或者,为了方便起见,也允许使用更简单的语法: $array1[0][1]

如果我们想要二级数组的所有元素的列表,则使用 取消引用它@,例如:

my @l2 = @{ $array1[0] };   # or, using
my @l2 = $array1[0]->@*;    # postfix dereferencing
Run Code Online (Sandbox Code Playgroud)

或者,只获取数组的几个元素,但在一勺中——一个切片

my @l2_slice = @{$array1[0]}[1..2];  # or
my @l2_slice = $array1[0]->@[1..2];  # postfix reference slice
Run Code Online (Sandbox Code Playgroud)

返回包含同一二级数组的第二个和第三个元素的列表。

第二行是一种称为postfix dereferencing的新语法,从 v5.24 开始稳定。它为我们提供了与钻取单个元素时相同的获取元素的逻辑,通过从左到右的方式进行操作。因此,->@*要获取 arrayref、->%*hashref(等等)的所有元素的列表。例如,请参阅perl.com 文章effective Perler文章

当涉及到使用引用构建的多维结构时,有一点需要警告。有两种不同的方法来创建它们:通过使用对现有的、命名的变量的引用

my @a1 = 5 .. 7;
my %h1 = ( a => 1, b => 2 );

my @tla1 = (\@a1, \%h1);
Run Code Online (Sandbox Code Playgroud)

或者使用匿名的,其中 arrayrefs 由 构造[],hashrefs 由{}

my @tla2 = ( [ 5..7 ], { a => 1, b => 2 } );
Run Code Online (Sandbox Code Playgroud)

记住这种差异很重要。在第一种情况下,对数组携带的变量的引用可用于更改这些变量——如果我们更改其中的元素,@tla1那么我们实际上会更改引用的变量

$tla1[0][1] = 100;  # now @a1 == 5, 100, 7
Run Code Online (Sandbox Code Playgroud)

@tla1此外,通过顶级数组也可以看到更改引用的变量。

对于匿名数组和散列来说,@tla情况并非如此作为@tla访问独立数据的元素(引用),不能以任何其他方式访问(和更改)这些数据。

这两种构建复杂数据结构的方法都有其用途。