推送到数组引用

时间:2010-06-16 15:37:52

标签: perl arrays reference

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

例如,

my @a = ();

my $a_ref = [@a];

push(@$a_ref,"hello");

print $a[0];

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

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

4 个答案:

答案 0 :(得分: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.

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

而是将$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.

答案 1 :(得分:7)

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

my $arrayRef = [];
push $arrayRef, "one";
push $arrayRef, "two";
print @$arrayRef;

输出

onetwo

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

  

从Perl 5.14开始,push可以采用必须保持的标量EXPR   对未经处理的数组的引用。

Pre 5.14你必须先取消引用数组引用。

push @$arrayRef, "item";

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

答案 2 :(得分:3)

$a不是$a_ref,($a是第一个给予sort{}的比较变量,$a[0]@a的第0个元素1}}数组)。永远不要在自定义排序子例程之外使用$a$b,并且也应该避免@a@b数组(有有很多更好的选择)...

您正在做的是分配给$a_ref,一个匿名数组,然后将其推送到"hello",但打印出@a数组的第一个元素。

答案 3 :(得分:1)

是的,可能。这适合我。

my @a = (); 
my $aref = \@a; # creates a reference to the array a

push(@$aref, "somevalue"); # dereference $aref and push somevalue in it

print $a[0]; # print the just pushed value, again @$aref[0] should also work

如上所述,$aref = [@a]将复制而不是创建对

的引用