Arrays Perl中空列表引用的数组上下文赋值——请解释“1”行;my@arr=[]&引用;
我是Perl新手。我理解Arrays Perl中空列表引用的数组上下文赋值——请解释“1”行;my@arr=[]&引用;,arrays,perl,list,reference,perl-data-structures,Arrays,Perl,List,Reference,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(", ", @
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";
输出
ARRAY(0xd6ede8), 1
a[0]: 11, 12
这是怎么回事?非常感谢您提供的详细信息
@arr = [];
与
@arr = ([]);
或
它创建一个包含一个元素的数组,一个对空数组的引用
声明
@arr = [];
push @arr, 1;
push(@arr[0], 11);
push(@arr[0], 12);
创建一个包含两个元素的数组:对空数组的引用和标量值1
,如
@arr = ();
$arr[0] = [];
$arr[1] = 1;
最后,在声明中
@arr = [];
push @arr, 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;
你的理解是正确的
[]
总是创建一个数组引用,引用总是标量。这里,my@arr=[]
(或等效地:my@arr=([])
)创建一个数组@arr
,第一个元素是数组引用
标量永远不依赖于上下文!上下文只对你重要
- 散列或数组变量:
@foo
和%foo
- 子例程调用,因为调用传播当前上下文,并且可以通过
wantarray
查询。因此,子例程在各种上下文中的行为可能不同
- 运算符,如
、
或等运算符。
根据上下文完全不同
[]
是一个标量值,恰好是一个数组引用
这:
将@arr
创建为具有单个元素的数组;该元素的值为42
。写得更清楚的是:
my @arr = ( 42 );
my @arr = ( [] );
非常类似地,这:
my @arr = [];
还将@arr
创建为具有单个元素的数组;该元素的值是[]
,一个数组引用。写得更清楚的是:
my @arr = ( 42 );
my @arr = ( [] );
意思是一样的
或者,如果您确实希望@arr
为空数组:
my @arr = ();
或者可能类似于:
my $arr_ref = [];
(可能很不幸,数组上下文中的标量值被视为单个元素列表;我怀疑它造成的混乱超出了该功能的用处。)在每个Perl程序开始时,必须始终使用strict
和使用warnings
。在这种情况下,后者会警告您,最好将标量值@arr[0]写成$arr[0]
。在更高版本的Perl中,推送到数组引用是有效的,@arr
的第一个元素是引用。要显式访问数组,您需要编写@{$arr[0]}
[…]
大致相当于do{my@anon=(…);\@anon}
。它返回一个引用,引用是标量,因此数组元素的合法值。[]
总是创建一个数组引用,除非在/
之间,对吗?@bf2020方括号在表达式级别上使用时总是表示数组引用。当然,它们在字符串文本“[0]”
或正则表达式/[0]/
或用作数组下标$arr[0]
中没有此含义。接受此答案,因为有关上下文的信息很有用。