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

时间:2014-01-23 09:52:34

标签: arrays perl reference

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

2 个答案:

答案 0 :(得分:7)

如果您对@myArr成为包变量(our)而不是词汇变量(my)感到高兴,您可以这样做:

our @myArr;
local *myArr = $arr_ref;

这将使@myArr像$ arr_ref所指向的数组的别名一样。

如果您需要@myArr是词法,那么您可以使用Data::Alias

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

答案 1 :(得分:1)

Perl 5.22添加了“引用别名”或分配给引用,这正是您想要的:

library(DescTools)
DunnTest(Sepal.Width~Species, iris)
# 
#  Dunn's test of multiple comparisons using rank sums : holm  
# 
#                      mean.rank.diff    pval    
# versicolor-setosa            -67.38 2.0e-14 ***
# virginica-setosa             -46.50 1.5e-07 ***
# virginica-versicolor          20.88  0.0158 *  
# ---
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1