Perl通过推入子程序修改参考数组

时间:2015-10-27 04:13:22

标签: arrays perl pass-by-reference

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

这是我所做的一小部分:

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。

2 个答案:

答案 0 :(得分:7)

原始数组未被修改,因为您正在将@array中的readLine()复制到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")

输出:

; display_errors
; Default Value: On
; Development Value: On
; Production Value: Off

; display_startup_errors
; Default Value: On
; Development Value: On
; Production Value: Off

; error_reporting
; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT 
; Production Value: E_ALL & ~E_DEPRECATED

; html_errors 
; Default Value: On 
; Development Value: On 
; Production value: Off

; log_errors
; Default Value: On 
; Development Value: On 
; Production Value: On

答案 1 :(得分:4)

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

您可以直接轻松地推送到引用的数组。

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

您编写的代码期望$myvalue已经脱离了天空(或者可能在全球范围内定义了它?)但是假设它有一个值,那么该值将被推到引用的数组。