在C#中,可以创建对引用类型的引用:
SomeObject origObj = new SomeObject();
SomeObject objRef = origObj;
origObj和objRef都引用相同的对象。
现在,在perl中:
my @arr = (1,2,3);
method(\@arr);
sub method
{
my $arr_ref = shift;
foreach my $element (@{$arr_ref})
{
#...
}
}
我想在方法内部使用“ @myArr”,而不必每次都强制转换:“ @ {$ arr_ref}”-并在不创建数组副本的情况下执行此操作(因为我的“ @myArr = @ {$ arr_ref}“将创建一个副本)。
总结:如何在不创建副本的情况下获取“ @myArr = @ {$ arr_ref}”?
如果您希望@myArr
成为包变量(our
)而不是词法变量(my
),则可以执行以下操作:
our @myArr;
local *myArr = $arr_ref;
这将使@myArr充当$ arr_ref指向的数组的别名。
如果您需要@myArr
为词法,则可以使用Data::Alias:
use Data::Alias;
alias(my @myArr = @$arr_ref);
Perl 5.22添加了“ refaliasing”或分配给引用,这正是您想要的:
no warnings qw(experimental);
use feature qw(refaliasing);
my $a = [1, 2, 3];
\my @b = $a; # a & b are the same array
my @c;
\@c = $a; # a, b, & c are the same array
push @b, 4;
push @c, 5;
print "@$a\n"; # prints 1 2 3 4 5