推送到数组引用

Mik*_*ike 31 arrays perl reference

可以push在Perl中使用数组引用吗?谷歌搜索建议我首先尊重数组,但这并没有真正起作用.它推送到deferenced数组,而不是引用的数组.

例如,

my @a = ();

my $a_ref = [@a];

push(@$a_ref,"hello");

print $a[0];
Run Code Online (Sandbox Code Playgroud)

@a 将不会更新,此代码将失败,因为该数组仍为空

(我还在学习Perl参考文献,所以这可能是一个非常简单的问题.如果有的话,很抱歉)

小智 47

考虑内存地址而不是变量名称可能有所帮助.

my @a = ();       # Set aside memory address 123 for a list.

my $a_ref = [@a]; # Square brackets set aside memory address 456.
                  # @a COPIES the stuff from address 123 to 456.

push(@$a_ref,"hello"); # Push a string into address 456.

print $a[0]; # Print address 123.
Run Code Online (Sandbox Code Playgroud)

字符串进入了不同的内存位置.

而是将$a_ref变量指向列表的内存位置@a.push影响存储器位置123.由于@a也指存储器位置123,其值也改变.

my $a_ref = \@a;       # Point $a_ref to address 123. 
push(@$a_ref,"hello"); # Push a string into address 123.
print $a[0];           # Print address 123.
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释.但是你可以使用至少某些深层次的perl使用的术语,并指出`[...]`是*构造函数*表达式. (7认同)

Des*_*tar 7

您可以直接推送到数组引用而无需引用.

my $arrayRef = [];
push $arrayRef, "one";
push $arrayRef, "two";
print @$arrayRef;
Run Code Online (Sandbox Code Playgroud)

输出

onetwo
Run Code Online (Sandbox Code Playgroud)

文档:http://perldoc.perl.org/functions/push.html

从Perl 5.14开始,push可以采用标量EXPR,它必须包含对未经处理的数组的引用.

在5.14之前,您必须首先取消引用数组引用.

push @$arrayRef, "item";
Run Code Online (Sandbox Code Playgroud)

编辑:Annnnd直接推送到数组ref已在最近的perl版本中弃用(5.24?).鉴于此,在推动增加代码兼容性之前始终取消引用@ {$ arrayRef}会更安全.

  • 实际上在Perl 5.24中删除了对引用的`push`. (4认同)