2015-10-27 52 views
1

我有一个数组,我想在子程序中修改。它作为第二个参数通过引用传入。它似乎没有被修改,因为当我返回时,数组的长度与原始值相同。Perl通过推入子程序修改参考数组

下面是我所做的一个片段:

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。

回答

4

您声明词汇(本地)变量中你的readLine子程序,并且在子程序结束时它的值被丢弃。你永远不会使用你传入的实际数组,因为你创建了它的副本。

虽然您可以直接轻松地将其推入引用数组中。

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

您作为编写的代码预计$myvalue已经跌出天空的(也可能是它在全球范围内定义的地方吗?)不过,假设它有一个值,该值将被压入引用数组。

+0

'$ myvalue'从哪里来? –

7

原始数组未被修改,因为您将其复制到@arrayreadLine()中。你需要做这样的事情,而不是,你在实际的参考,而不只是一个拷贝作用,其中:

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")