2010-06-16 99 views
23

是否有可能push到Perl中的数组引用?谷歌搜索建议我首先尊重数组,但这并不实际。它推入推理数组,而不是引用数组。推送到数组参考

例如,

my @a =(); 

my $a_ref = [@a]; 

push(@$a_ref,"hello"); 

print $a[0]; 

@a将不会被更新,该代码将失败,因为阵列仍然是空

(我还在学习Perl的引用,所以这可能是一个令人难以置信的简单问题。很抱歉,如果如此)

+9

'my $ a_ref = \ @a;' - 您创建了一个新的array_references,第一个元素为空数组 - >所以只是一个空数组。 – Konerak 2010-06-16 15:39:41

+5

'$ a_ref = [@a];'没有引用原始的'@ a' - 它复制其内容。 – Ether 2010-06-16 16:21:30

回答

39

这可能有助于根据内存地址而不是变量名称进行思考。

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. 
+6

很好的解释。但是你可以使用perl至少有一些深层次的术语,并指出''是*构造函数*表达式。 – Axeman 2010-06-16 16:23:31

+0

注意:当您将它传递给推送(至少使用现代Perl)时,您不必解引用数组引用。 但我想象Perl在这两种情况下的表现完全相同。 – Jonathon 2013-03-02 03:20:06

+0

使用push时不会拒绝重新创建数组的副本吗? – Lukazoid 2016-12-14 12:09:58

3

$a$a_ref,($a是给予一个sort{}第一比较变量,$a[0]@a数组的第0个元素).Never使用$a,或$b外的自定义排序子程序,而且应该尽量避免@a@b阵列太(有很多更好的选择)...

你在做什么是分配到$a_ref,一个匿名数组,然后推到它"hello",但打印出@a阵列的第一个元素。

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]复制和不能创建参照

6

可以直接推到一个数组引用而不deferencing。

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

输出

onetwo 

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

用Perl 5.14开始,推可以采取一个标量EXPR,其必须保持 到unblessed数组的引用。

5.14版必须先取消引用数组ref。

push @$arrayRef, "item"; 

编辑:Annnnd直接推送到阵列ref已被弃用在最近的perl版本(5.24?)。鉴于此,在推动增加代码的兼容性之前总是解除引用@ {$ arrayRef}会更安全。

+0

引用上的'push'实际上完全在Perl 5.24中被删除。 – Xaerxess 2017-09-08 07:57:33