我有类似于下面的代码:
my @array1 = (); #2d array to be used
my $string1 = "blank1";
my $string2 = "blank2";
my $string3 = "blank3";
my @temp = ($string1, $string2, $string3);
push (@array1, \@temp);
我分配字符串然后将它们放入数组的原因是因为它们在循环中并且值在循环中得到更新(@array1 未在循环中声明)。
当我运行我的程序时,它只给我一个数组的引用,而不是一个实际的二维数组。如何让它将内容打印为二维数组而不是作为引用或展平为一维数组?
我想要像 [[blank1, blank2, blank3],....]
这样的输出,这样我就可以像 $array1[i][j]
最佳答案
数组只能有元素的标量。因此,这包括对数组的引用,例如,它使我们能够构建复杂的数据结构。参见 perldsc , Tom's Perl Data Structure Cookbook。
这些(“二级”)数组的元素由 dereferencing 访问,所以 $array1[0]->[1]
是数组的第二个元素,其引用是顶级数组 (@array1
) 的第一个元素。或者,为方便起见,也允许使用更简单的语法:$array1[0][1]
。
如果我们想要一个二级数组的所有元素的列表,那么用@
取消引用它,比如:
my @l2 = @{ $array1[0] }; # or, using
my @l2 = $array1[0]->@*; # postfix dereferencing
或者,只获取数组的几个元素,但一次获取 -- slice
my @l2_slice = @{$array1[0]}[1..2]; # or
my @l2_slice = $array1[0]->@[1..2]; # postfix reference slice
what 返回具有相同二级数组的第二个和第三个元素的列表。
第二行是一种新的语法,称为 postfix dereferencing , 从 v5.24 开始稳定。通过从左到右一直工作,它为我们提供了与钻取单个元素时相同的逻辑来获取元素。所以 ->@*
获取 arrayref 的所有元素列表,->%*
获取 hashref(等)。参见例如 perl.com article和一个 Effective Perler article .
当涉及到使用引用构建的多维结构时,需要注意一件事。 create them 有两种不同的方式: 通过使用对现有命名变量的引用
my @a1 = 5 .. 7;
my %h1 = ( a => 1, b => 2 );
my @tla1 = (\@a1, \%h1);
或使用匿名的,其中 arrayrefs 由 []
构造,hashrefs 由 {}
my @tla2 = ( [ 5..7 ], { a => 1, b => 2 } );
牢记区别很重要。在第一种情况下,对数组携带的变量的引用可用于更改这些变量——如果我们更改 @tla1
的元素,那么我们实际上更改了引用的变量
$tla1[0][1] = 100; # now @a1 == 5, 100, 7
此外,通过顶级数组也可以看到使用 @tla1
中的引用更改变量。
对于 @tla
中的匿名数组和散列,情况并非如此,因为 @tla
的元素(引用)访问独立数据,这些数据无法访问(和更改) ) 以任何其他方式。
这两种构建复杂数据结构的方法都有其用途。
关于arrays - 二维阵列打印作为引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72822673/