我用这种方式创建了一个多维数组:
#!/usr/bin/perl
use warnings;
use strict;
my @a1 = (1,2);
my @a2 = (@a1,3);
Run Code Online (Sandbox Code Playgroud)
但事实证明我仍然有一个一维数组......
perl中的正确方法是什么?
你得到一维数组,因为数组@a1在parens中扩展.所以,假设:
my @a1 = (1,2);
my @a2 = (@a1,3);
Run Code Online (Sandbox Code Playgroud)
然后你的第二个陈述相当于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.
注意分配给数组时()和之间的区别[].括号[]创建一个匿名数组,它返回一个数组引用作为标量值(例如,可以由$a1,或保持$a2[0]).
另一方面,Parens根本不做任何事情,除了改变运算符的优先级.
考虑一下这段代码:
my @a2 = 1, 2, 3;
print "@a2";
Run Code Online (Sandbox Code Playgroud)
这将打印1.如果你use warnings,你也会得到一个警告,如:Useless use of a constant in void context.基本上会发生什么:
my @a2 = 1;
2, 3;
Run Code Online (Sandbox Code Playgroud)
因为逗号(,)的优先级低于equalsign =.(参见perldoc perlop中的 "运算符优先级和相关性" )
parens做的只是简单地取消和的默认优先级,=并在列表中,组合1,2,3在一起,然后传递给它@a2.
因此,简而言之,括号中[]有一些神奇之处:它们创建了匿名数组.Parens ()只是改变了优先级,就像数学一样.
文档中有很多内容需要阅读.这里曾经有人向我展示了一个非常好的解除引用链接,但我不记得它是什么.在perldoc perlreftut中,您将找到有关参考资料的基本教程.在perldoc perldsc中,您将找到有关数据结构的文档(感谢Oesor提醒我).
我提议通过工作perlreftut,perldsc并且perllol,最好是在同一天,最好使用Data::Dumper打印的数据结构.
这些教程相互补充,我认为它们会在一起产生更好的效果.可视化数据结构帮助我相信他们实际工作(认真)并看到我的错误.
| 归档时间: |
|
| 查看次数: |
10234 次 |
| 最近记录: |