了解数组数组

时间:2016-11-08 10:47:49

标签: perl

我将在阵列数组中查看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的私人内部名称,因此您可以确定它们是明确无误的。与“巴拉克奥巴马”不同,参考只涉及一件事,你总是知道它所指的是什么。如果您有对数组的引用,则可以从中恢复整个数组。如果您有对哈希的引用,则可以恢复整个哈希。但是参考仍然是一个简单,紧凑的标量值。   你不能有一个值为数组的哈希;哈希值只能是标量。我们坚持这一点。但是单个引用可以引用整个数组,引用是标量,所以你可以有一个对数组的引用的哈希,它的行为很像数组的哈希,它就像一个有用的一样。数组哈希。

1 个答案:

答案 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;数组本身,除非你把它作为参考传递。