我编写了一个简单的Perl程序( Driver.pl ),它传递array by reference
并调用calculate.pm
模块中的子程序 add 。
calculate.pm模块将两个值100和500压入数组。
当我在Driver.pl文件中打印数组时,它什么都不打印。
Driver.Pl文件:
use calculate;
our @my_array;
sub init() {
$x = 1;
calculate::add($x, /@my_array);
}
init();
for (@my_array) {
print $_; #Prints Nothing.
}
sub add() {
my ($x, @arr) = @_;
push (@arr, 100);
push (@arr, 200);
}
1;
答案 0 :(得分:5)
首先,这是你真正想要的代码:
档案Calculate.pm
:
package Calculate;
sub add {
my ($x, $arrayref) = @_;
push @$arrayref, 100, 200;
}
1;
档案Driver.pl
:
use Calculate;
my @array;
sub init {
Calculate::add(1, \@array);
}
init();
foreach (@array) {
print "$_\n";
}
我做了什么?好吧,我修复了所有(语法)错误:
\
,/
。for
或foreach
,但从不for each
。有一个each
函数允许我们迭代集合,但这在这里没用。()
这样的原型,除非您知道完全他们做了什么,他们是什么意思,以及为什么 在这里使用它们。 然后有一些严重的风格问题:
my
声明所有变量,除非您确实需要全局/动态变量。你没有。 print
之后的新行不会受到伤害。
在我们的add
函数中,我们收到一个数组引用。 (如果您了解C ++:Perl引用就像指针一样,而不是像C ++引用那样)。引用是标量,因此我们将其放入$arrayref
。为了得到实际的数组,我们取消引用就像@$arrayref
- 但不要复制,或者你没有操纵原文。
你可以将 slurp 剩余的参数放入数组中,例如my ($x, @list) = (1, 2)
将2
放入数组中。但在你的情况下,2
是一个数组引用!因此@list
包含一个元素,它是我们的数组引用 - 但它不是相同的数组。
这仍然不是优雅的代码,并且存在架构问题,但它现在至少应该编译。
答案 1 :(得分:4)
这将按预期工作。我已经删除了模块以便于调试。
#!/usr/bin/perl
use strict;
use warnings;
our @my_array;
init();
foreach(@my_array)
{
print $_; #Prints Nothing.
}
sub init
{
my $x=1;
add($x,\@my_array); # Note the backward slash - This is how reference is passed.
}
sub add
{
my ($x,$arr)=@_;
push (@{$arr},100); # Note how array is referenced.
push (@{$arr},200);
}
使用use strict;
和use warnings;
是一种很好的做法
答案 2 :(得分:2)
假设拼写错误只是在此处复制代码时出错(例如/@my_array
应该是\@my_array
),您需要在add()
中获取数组引用 ,而不是数组:
sub add(){
my ($x, $arr) = @_;
push (@$arr,100); # or push( @{ $arr }, 100 );
push (@$arr,200);
}
答案 3 :(得分:1)
sub init {
$x=1;
calculate::add($x,\@my_array);
}
sub add {
my ($x,$arr) = @_;
push (@$arr,100);
push (@$arr,200);
}
1;