了解数组数组

Bio*_*Rod 3 perl

我将在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()使用任何数组调用,只需获取数组元素列表即可.除非您将其作为参考传递,否则它不会"看到"数组本身.

  • @BioRod因为数组不能传递.它不像其他语言那样的对象.可以把数组想象成一个带有名字的列表.但是,当您将列表提供给其他人时,他们无法看到该名称.因此,当您使用数组作为函数的参数时,该函数将只看到元素列表.但是,如果你创建一个引用,你会得到**一件事**.引用是标量值.它只是指向保存数组的内存地址的指针.在那个地址后面,有你的阵列.然后`Dumper`可以对可见的数组进行引用. (3认同)