我是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";
这里发生了什么?非常感谢细节。
答案 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 = [];
(或许不幸的是,数组上下文中的标量值被视为单个元素列表;我怀疑它引起的混淆超出了该功能的用处。)