2011-08-06 99 views
0

看一看這段代碼:怪異的行爲引用

my @arr = (1, 2); 
my $ref = \@arr; 
my @s = @$ref; 
push @s, 4; 
print join(", ", @arr) . "\n"; 

出乎意料的是,輸出爲「1,2」。發生了什麼?我怎麼得到兩個不同的數組(@s是(1,2,4))?

當然我得到 「1,2,4,」 如果我寫,輸出,像這樣的事情之前:

$ref = \@s; 
@arr = @$ref; 

但似乎相當笨拙。

我習慣了其他的OOP語言,在這種語言中不會發生這樣的事情 - 一個對象可以修改,不管其引用如何。

那麼任何人都可以請幫助我嗎?

回答

2
my @s = @$ref; 

使得複製引用的數組的。之後,@s@arr是不相關的數組,恰好有相同的內容(有一段時間)。

如果要修改引用的數組,你必須直接使用它,例如:

push @$ref, 4; 

還有就是在Data::Alias模塊,(我認爲)讓你做什麼你問了。但是那裏有深刻的魔力,我從來沒有用過它。

+0

謝謝你的回答。這很奇怪,不是嗎?有什麼方法可以「修復」嗎?我的意圖如下:我有一個類,其中一個字段是對數組的引用。我希望在不同的類中更改該數組,所以我做了@array = @ {$ object - > {array}};這並沒有奏效。所以你說最好的方法是寫我的$ ref = $ object - > {array}並每次都推@ @ ref? – Rob

+0

@Rob,這是一種方法。在Perl 5.14中,您可以編寫'push $ ref,4'而不是(隱式解引用)。你也可以寫'push_array'方法,然後執行'$ object-> push_array(4)'。 [Moose :: Meta :: Attribute :: Native](http://search.cpan.org/perldoc?Moose::Meta::Attribute::Native)可以幫助簡化這一點。 – cjm

+0

好的,謝謝! – Rob