数组上下文分配到Perl中的空列表引用 - 请解释“my @arr = [];”行

时间:2014-03-07 16:37:15

标签: arrays perl list reference perl-data-structures

我是Perl的新手。我知道my @a = ();等同于my @a; - 都初始化一个空数组。同样,my $a = [];初始化由$a引用的空数组。

然而,我对my @arr = [];感到困惑,这也是合法的Perl。根据{{​​1}}和ref()print是一个数组,而不是对数组的引用。它可以被推入,这似乎返回了数组中元素的数量。但它似乎包含对另一个数组的引用,也可以推送到:

@arr

输出

#!/usr/bin/perl
use v5.16;

my @arr = [];
push(@arr, 1);

print join(", ", @arr) . "\n";

push(@arr[0], 11);
push(@arr[0], 12);

print "a[0]: " . join(", ", @{@arr[0]}) . "\n";

这里发生了什么?非常感谢细节。

3 个答案:

答案 0 :(得分:8)

@arr = [];

相同
@arr = ([]);

@arr = (); $arr[0] = [];

它创建一个包含一个元素的数组,一个对空数组的引用。


陈述

@arr = [];
push @arr, 1;

创建一个包含两个元素的数组:对空数组的引用和标量值1,如说

@arr = ();
$arr[0] = [];
$arr[1] = 1;

最后,在陈述中

push(@arr[0], 11);
push(@arr[0], 12);

第一个参数相当于$arr[0],这个例子中是一个数组引用。由于Perl> = v5.14,push函数可以对数组引用和数组进行操作,因此这些语句将元素添加到$arr[0]中保存的(最初为空)数组引用。所以现在@arr的内容与你说的

相同
@arr = ();
$arr[0] = [ 11, 12 ];     # ref to array with two elements
$arr[1] = 1;

答案 1 :(得分:4)

您的理解是正确的。

[]始终创建数组引用,引用始终是标量。在这里,my @arr = [](或等效地:my @arr = ([]))创建一个数组@arr,第一个元素是数组引用。

Scalars永远不依赖于上下文!上下文

很重要
  • 哈希或数组变量:@foo%foo
  • 子程序调用,当调用传播当前上下文时,可以通过wantarray查询。因此,子程序在各种上下文中的行为可能不同。
  • 运营商,因为某些运营商(如,..)完全不同,具体取决于具体情况。

答案 2 :(得分:2)

[]是标量值,恰好是数组引用。

此:

my @arr = 42;

创建@arr作为具有单个元素的数组;该元素的值为42。它写得更清楚:

my @arr = ( 42 );

非常相似,这个:

my @arr = [];

还创建@arr作为具有单个元素的数组;该元素的值是[],一个数组引用。它写得更清楚:

my @arr = ( [] );

这意味着同样的事情。

或者,如果你真的希望@arr成为一个空数组:

my @arr = ();

或者可能是:

my $arr_ref = [];

(或许不幸的是,数组上下文中的标量值被视为单个元素列表;我怀疑它引起的混淆超出了该功能的用处。)