【问题标题】:Understanding Arrays of Arrays了解数组的数组
【发布时间】:2016-11-08 10:47:48
【问题描述】:

我正在阅读数组数组部分中 perldsc 的文档,它显示了数组数组的样子

@AoA = (
    [ "fred", "barney" ],
    [ "george", "jane", "elroy" ],
    [ "homer", "marge", "bart" ],
  );

在下一节的第 1 - 4 行中,它展示了如何生成一个

# reading from file
  while ( <> ) {
 push @AoA, [ split ];
}

我想学习如何创建一个。我创建了一个文件,里面有以下内容。

约翰·亚当·乔

罗德·弗雷德·詹姆斯

艾莉森·弗兰克·让

然后我使用示例中的代码创建了一个数组数组

#!/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 引入了一个称为引用的特性,使用引用是在 Perl 中管理复杂的结构化数据的关键。

Perl 中的引用类似于数组和散列的名称。它们是 Perl 的私有内部名称,因此您可以确定它们是明确的。与“巴拉克奥巴马”不同,引用只指一件事,你总是知道它指的是什么。如果你有一个数组的引用,你可以从中恢复整个数组。如果您有对哈希的引用,则可以恢复整个哈希。但参考仍然是一个简单、紧凑的标量值。 你不能有一个值是数组的散列;哈希值只能是标量。我们被困住了。但是单个引用可以引用整个数组,并且引用是标量,因此您可以拥有对数组的引用的散列,它的行为很像数组的散列,它就像一个有用的数组的哈希。

【问题讨论】:

  • print Dumper(@AoA); 打印数组列表(同Dumper($AoA[0],$AoA[1], ..))

标签: perl


【解决方案1】:

这只是由于变量是如何传递给 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(),你只会得到数组元素的列表。除非您将其作为参考传递,否则它不会“看到”数组本身。

【讨论】:

  • 那么为什么在 Perl 中我必须将它作为参考传递才能看到数组的数组?
  • @BioRod 因为数组不能被传递。它不像其他语言中的对象。将数组想象成一个带有名称的列表。但是,当您将列表提供给其他人时,他们看不到名称。因此,当您使用数组作为函数的参数时,该函数只会看到元素列表。但是如果你创建一个引用,你会得到一件事。引用是一个标量值。它只是一个指向保存数组的内存地址的指针。在那个地址后面,有你的数组。然后Dumper 可以使对数组的引用可见。
猜你喜欢
  • 2015-07-23
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多