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