在Perl中将浅复制引用到变量中

7
在Perl中,您可以像这样将变量赋值为另一个变量的引用:
my @array = (1..10);
my $ref = \@array;

作为一个引用,你可以这样做,两个变量都会受到影响:

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

两个变量都包含 1..12 ,因为它们都指向同一空间。

现在,我想知道是否有任何方法可以完成相同的操作,但是从引用开始,然后将该引用分配给普通变量。例如:

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
请提供翻译内容。 - user966588
请注意Ikegami关于最明智的方法的注释。如果您使用嵌套的Perl结构足够多,您会习惯于将其作为引用检索,而不是将其复制到数组变量中。这只会在$类型上增加1个字符。 - Axeman
@Axeman2:是的,当然。这个问题更多地涉及教育精神。 :-) - Francisco Zarabozo
2个回答

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

5
当数组是包变量时,可以使用类型符号进行此操作。
my $foo = [7,8,9];
our @bar;
*bar = $foo;
$foo->[1] = 3;
print @bar;     # "739"

词法变量(即my @bar)不能通过类型引用进行赋值。 也许可以使用围绕PadWalker构建的词法解决方案或解决方法。


2
Data::Alias,不是PadWalker。 - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接