浅复制引用到的变量在Perl

问题描述:

在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

方式四:

  • 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] } 

这可以在数组是一个包变量时使用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