Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl中空列表引用的数组上下文赋值——请解释“1”行;my@arr=[]&引用;_Arrays_Perl_List_Reference_Perl Data Structures - Fatal编程技术网

Arrays Perl中空列表引用的数组上下文赋值——请解释“1”行;my@arr=[]&引用;

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(", ", @

我是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";
输出

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]
中没有此含义。接受此答案,因为有关上下文的信息很有用。