我将在阵列数组中查看perldsc的文档,它显示了数组数组的样子
@AoA = (
[ "fred", "barney" ],
[ "george", "jane", "elroy" ],
[ "homer", "marge", "bart" ],
);
在第1-4行的下一节中,它展示了如何生成一个
# reading from file
while ( <> ) {
push @AoA, [ split ];
}
我想学习如何创建一个。我创建了一个文件,其中包含以下内容。
John Adam Joe
罗德弗雷德詹姆斯 艾利森弗兰克让
然后我使用示例中的代码创建了一个数组数组
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @AoA;
while ( <> ) {
push @AoA, [ split ];
}
print Dumper(@AoA);
当我运行代码时,Dumper的内容是
$VAR1 = [
'John',
'Adam',
'Joe'
];
$VAR2 = [
'Rod',
'Fred',
'James'
];
$VAR3 = [
'Allison',
'Frank',
'Jean'
];
正如我所看到的,它打印了3个数组,我认为它应该打印一个数组数组。
但是当我用一个小修改运行相同的代码时
print Dumper(\@AoA);
打印出来。
$VAR1 = [
[
'John',
'Adam',
'Joe'
],
[
'Rod',
'Fred',
'James'
],
[
'Allison',
'Frank',
'Jean'
]
];
这是一个阵列数组。
以下是我对\ @AoA的理解。这是指向@AoA内存位置的指针。那么请说明为什么我必须使用\ @AoA来获得预期的输出?
更新
我认为我的困惑在perlreftut中得到了清楚的解释
Perl 5中最重要的新功能之一是能够管理复杂的数据结构,如多维数组和嵌套哈希。为了实现这些功能,Perl 5引入了一个名为references的功能,使用引用是管理Perl中复杂的结构化数据的关键。
Perl中的引用类似于数组和哈希的名称。它们是Perl的私人内部名称,因此您可以确定它们是明确无误的。与“巴拉克奥巴马”不同,参考只涉及一件事,你总是知道它所指的是什么。如果您有对数组的引用,则可以从中恢复整个数组。如果您有对哈希的引用,则可以恢复整个哈希。但是参考仍然是一个简单,紧凑的标量值。 你不能有一个值为数组的哈希;哈希值只能是标量。我们坚持这一点。但是单个引用可以引用整个数组,引用是标量,所以你可以有一个对数组的引用的哈希,它的行为很像数组的哈希,它就像一个有用的一样。数组哈希。
答案 0 :(得分:7)
这只是因为变量如何传递给Perl子例程。
sub
将任意长度的变量列表作为其参数。如果使用数组作为参数调用sub,则所有数组元素都将传递给sub。
所以
my @array = (1,2,3);
foo(@array);
从子角度来看,没有什么不同:
my $a = 1;
my $b = 2;
my $c = 3;
foo($a,$b,$c);
如果您使用任何数组调用Dumper()
,您只需获取数组元素列表即可。它赢了&#34;看&#34;数组本身,除非你把它作为参考传递。