Perl Array dereference在将其作为参数传递给子例程时无法正常工作

时间:2014-05-15 19:13:23

标签: arrays perl reference dereference

我将数组作为ref传递给sub。在那里我必须为它添加值,但它不起作用。我的代码是:

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

1 个答案:

答案 0 :(得分:4)

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

我假设您希望您的函数实际修改引用指向的数组。要做到这一点,请删除my @array = ...行并将push调用更改为以下内容,使用引用而不复制:

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

为了便于阅读,您可以将数组引用分配给命名的标量变量,并改为使用它:

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