【问题标题】:Perl Array dereference not working properly while passing it as an argument to a subroutinePerl 数组取消引用在将其作为参数传递给子例程时无法正常工作
【发布时间】:2014-07-04 09:44:48
【问题描述】:

我将一个数组作为参考传递给一个子。在那里我必须为其添加值,但它不起作用。我的代码是:

my @scalarArray1 = ();

sub CompareScalers() {
    fillScalarArray( $_[0], \@scalarArray1 );    #pass arrays by ref
}

sub fillScalarArray() {
    my $filename = $_[0];                        #first file name as input file
    open( my $fh, '<:encoding(UTF-8)', $filename ) or die "Could not open file '$filename' $!";
    my @array = @{ $_[1] };
    while ( my $row = <$fh> ) {
        push( @array, $row );
    }
}

while循环结束时数组大小的调试打印如下:

 DB<29> p $#scalarArray1
-1
 DB<30> p $#array
1551

【问题讨论】:

  • 为什么你 prototyped 你的潜艇允许每个人的参数为零?这似乎在最坏的情况下是错误的,在最好的情况下是误导性的。

标签: arrays perl reference dereference


【解决方案1】:

my @array = @{$_[1]} 复制数组。当您将项目推送到副本上时,原始数组不受影响。

我假设您希望您的函数实际修改引用指向的数组。为此,请删除 my @array = ... 行并将您的 push 调用更改为如下所示,它使用引用而不复制:

push (@{$_[1]} , $row);

为了可读性,您可以将数组引用分配给命名的标量变量并使用它来代替:

my $arrayRef = $_[1];
push @{$arrayRef}, $row;

【讨论】:

  • 谢谢,明白了...我检查了参考资料,两者都有区别。感谢您的输入。这是正确的答案。
  • 我们可以命名引用的数组吗?像我的 $array = @{$_[0]} ,然后在我们的 sub 中使用数组名称?只是出于可读性目的。
  • 是的。在答案中添加了一个示例。
  • 如果使用 Perl v5.14 或更高版本,您可以直接推送到引用。
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 2020-03-01
  • 2021-03-09
  • 2015-01-24
  • 2012-05-18
  • 2011-01-06
  • 1970-01-01
  • 2016-07-21
相关资源
最近更新 更多