在Perl中将浅拷贝引用转换为变量

时间:2013-04-06 03:35:25

标签: perl shallow-copy arrayref

在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相同的变量?

2 个答案:

答案 0 :(得分: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



前面提到的Tie :: StdArrayX:

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

答案 1 :(得分:5)

当数组是包变量时,可以使用typeglobs来完成。

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

但是,无法使用typeglobs将词法变量(即my @bar)分配给它。 也许围绕PadWalker构建了一个词汇解决方案或解决方法。