Perl 通过推入子程序修改引用数组

Perl Modifying Reference Array via Push in Subroutine

我有一个数组要在子程序中修改。它作为第二个参数通过引用传递。好像没有修改,因为我return的时候,数组的长度和原来的值一样

这是我所做的片段:

sub readLine
{
    my @array = @{$_[1]};
    #Push value onto array
    push @array, $myvalue;
}

sub main 
{
    my @array = ();
    #Pass by reference
    readLine($argument1, \@array);

    print @array; #Prints 0
}

我是 Perl 的新手,如果我这样做正确,请告诉我。我阅读了类似问题的答案,但它仍然没有为我打印正确的值 (1)。我安装了最新版本的 Perl。

原始数组未被修改,因为您正在将其复制到 readLine() 中的 @array 中。你需要做这样的事情,你正在根据实际参考而不只是一个副本行事:

use strict;
use warnings;
use Data::Dump;

main();

sub main {
    my @array;
    foo(\@array, 'bar', 'bat', 'baz');
    dd(@array);
}

sub foo {
    my ($aref, @args) = @_;
    push(@$aref, @args);
}

输出:

("bar", "bat", "baz")

您在 readLine 子例程中声明了一个词法(局部)变量,并且在子例程结束时它的值被丢弃。您永远不会使用传入的实际数组,因为您制作了它的副本。

尽管如此,您可以直接轻松地推送到引用数组。

push @{$_[1]}, $myvalue;

您编写的代码预计 $myvalue 已经从天而降(或者它可能在全局范围内某处定义?)但假设它有一个值,该值将被推入引用数组.