我想在子程序中修改一个数组。它作为第二个参数通过引用传入。它似乎没有被修改,因为当我返回时,数组的长度与原始值相同。
这是我所做的一小部分:
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。
答案 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
已经脱离了天空(或者可能在全球范围内定义了它?)但是假设它有一个值,那么该值将被推到引用的数组。