在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相同的变量?
答案 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
构建了一个词汇解决方案或解决方法。