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

Max*_*ace 3 arrays perl reference list perl-data-structures

我是Perl的新手.我明白这my @a = ();相当于my @a;- 都初始化一个空数组.同样,my $a = [];初始化一个引用的空数组$a.

但是,我很困惑,my @arr = [];这也是合法的Perl.根据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";
Run Code Online (Sandbox Code Playgroud)

输出

ARRAY(0xd6ede8), 1
a[0]: 11, 12
Run Code Online (Sandbox Code Playgroud)

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

mob*_*mob 8

@arr = [];
Run Code Online (Sandbox Code Playgroud)

是相同的

@arr = ([]);
Run Code Online (Sandbox Code Playgroud)

要么

@arr = (); $arr[0] = [];
Run Code Online (Sandbox Code Playgroud)

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


声明

@arr = [];
push @arr, 1;
Run Code Online (Sandbox Code Playgroud)

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

@arr = ();
$arr[0] = [];
$arr[1] = 1;
Run Code Online (Sandbox Code Playgroud)

最后,在声明中

push(@arr[0], 11);
push(@arr[0], 12);
Run Code Online (Sandbox Code Playgroud)

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

@arr = ();
$arr[0] = [ 11, 12 ];     # ref to array with two elements
$arr[1] = 1;
Run Code Online (Sandbox Code Playgroud)