Perl中的数组引用是否可以push
?谷歌搜索建议我首先尊重数组,但这并没有真正起作用。它推送到deferenced数组,而不是引用的数组。
例如,
my @a = ();
my $a_ref = [@a];
push(@$a_ref,"hello");
print $a[0];
@a
将不会更新,此代码将失败,因为数组仍为空
(我还在学习Perl参考文献,所以这可能是一个非常简单的问题。如果是的话,很抱歉)
答案 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]
将复制而不是创建对