Perl:如何在不创建副本的情况下将数组引用转换为数组

问题描述 投票:2回答:2

在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}”?

arrays perl reference
2个回答
7
投票

如果您希望@myArr成为包变量(our)而不是词法变量(my),则可以执行以下操作:

our @myArr;
local *myArr = $arr_ref;

这将使@myArr充当$ arr_ref指向的数组的别名。

如果您需要@myArr为词法,则可以使用Data::Alias

use Data::Alias;
alias(my @myArr = @$arr_ref);

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.