2013-04-06 28 views
7

在Perl中,你可以分配給一個變量的引用到另一個變量,就像這樣:淺複製引用到的變量在Perl

my @array = (1..10); 
my $ref = \@array; 

而且,因爲它是一個參考,你可以做這樣的事情,並這兩個變量將受到影響:

push @array, 11; 
push @$ref, 12; 

和兩個變量將包含1..12,因爲它們都指向同一個空間。

現在,我想知道是否有任何方法可以做同樣的事情,但從ref開始,然後將該引用分配給一個普通變量。例如:

my $ref = [1..12]; 
my @array = # something here that makes @array point to the same space $ref contains 

我知道我可以只給它分配是這樣的:

my @array = @$ref; 

但是,這是一個副本。如果我改變$ ref或@array,那將是獨立的改變。

有沒有辦法讓@array指向與$ ref相同的變量?

+1

重複http://stackoverflow.com/questions/14070342/typeglob-aliases – 2013-04-06 12:10:23

+0

記池上的注意關於最明智的做法。如果你使用嵌套的Perl結構,那麼你會習慣把它作爲一個ref來獲取,而不是將它複製到一個數組變量。它只增加1個字符輸入到'$'。 – Axeman 2013-04-06 14:20:20

+0

@ Axeman2:當然可以。這個問題更多的是教育精神。 :-) – 2013-04-06 16:50:26

回答

7

方式四:

  • our @array; local *array = $ref;
  • \my @array = $ref;(實驗性功能添加到5.22)
  • use Data::Alias; alias my @array = @$ref;
  • 使用魔法(比如tie my @array, 'Tie::StdArrayX', $ref;

但當然,明智的辦法是做

my $array = $ref; 

並使用@$array代替@array



上述領帶:: StdArrayX:

package Tie::StdArrayX; 
use Tie::Array qw(); 
our @ISA = 'Tie::StdArray'; 
sub TIEARRAY { bless $_[1] || [], $_[0] } 
5

這可以在數組是一個包變量時使用typeglobs來完成。

my $foo = [7,8,9]; 
our @bar; 
*bar = $foo; 
$foo->[1] = 3; 
print @bar;  # "739" 

詞彙的變量(即my @bar)不能被分配到與類型團,雖然。 也許在PadWalker周圍建立了一個詞法解決方案或解決方法。

+2

Data :: Alias,而不是PadWalker。 – ikegami 2013-04-06 12:14:42