你得到一个一维数组,因为数组@a1
在括号内展开。所以,假设:
my @a1 = (1, 2);
my @a2 = (@a1, 3);
那么你的第二条语句相当于my @a2 = (1,2,3);
.
创建多维数组时,您有几种选择:
- 直接赋值每个值
- 取消引用现有数组
- 插入参考
第一个选项基本上是$array[0][0] = 1;
并且不是很令人兴奋。
第二个是这样做的:my @a2 = (\@a1, 3);
。请注意,这会引用数组的名称空间@a1
,所以如果你以后改变@a1
,里面的值@a2
也会改变。它并不总是推荐的选项。
第二个选项的变体是这样做的:my @a2 = ([1,2], 3);
。中括号会创建一个匿名数组,该数组没有命名空间,只有内存地址,并且只会存在于内部@a2
.
第三个选项有点晦涩难懂,是这样做的:my $a1 = [1,2]; my @a2 = ($a1, 3);
。它会做与 2 完全相同的事情,只是数组引用已经在一个标量变量中,称为$a1
.
注意之间的区别()
and []
分配给数组时。括号[]
创建一个匿名数组,它返回一个数组引用作为标量值(例如,可以由$a1
, or $a2[0]
).
另一方面,括号除了改变运算符的优先级之外,实际上什么也不做。
考虑这段代码:
my @a2 = 1, 2, 3;
print "@a2";
这将打印1
。如果你use warnings
,您还会收到警告,例如:Useless use of a constant in void context
。基本上,会发生这种情况:
my @a2 = 1;
2, 3;
因为逗号 (,
) 的优先级低于等号=
。 (参见“运算符优先级和结合性”佩尔多克·佩洛普 http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity.)
括号只是否定默认优先级=
and ,
,和组1,2,3
一起放在一个列表中,然后传递给@a2
.
所以,简而言之,括号里,[]
,它们有一些魔力:它们创建匿名数组。括号,()
,只需更改优先级,就像数学中一样。
文档中有很多内容需要阅读。这里有人曾经向我展示过一个非常好的取消引用链接,但我不记得它是什么了。在佩尔多克·佩尔雷夫特 http://perldoc.perl.org/perlreftut.html您将找到有关参考资料的基本教程。并且在perldoc perldsc http://perldoc.perl.org/perldsc.html您将找到有关数据结构的文档(谢谢奥索尔提醒我 https://stackoverflow.com/questions/6425893/how-can-i-create-a-multi-dimensional-array-in-perl/6425961#6425961).