通过引用传递数组

时间:2013-09-03 14:58:17

标签: arrays perl

我编写了一个简单的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.
}

calculate.pm

sub add() {
    my ($x, @arr) = @_;
    push (@arr, 100);
    push (@arr, 200);
}
1;

4 个答案:

答案 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";
}

我做了什么?好吧,我修复了所有(语法)错误:

  • 参考运算符为\/
  • 循环为forforeach,但从不for each。有一个each函数允许我们迭代集合,但这在这里没用。
  • 不要使用像()这样的原型,除非您知道完全他们做了什么,他们是什么意思,以及为什么 在这里使用它们。
  • 将明确的包声明放入库文件中。

然后有一些严重的风格问题:

  • 使用大写名称命名您的包 - 为“pragma”保留小写名称。
  • 使用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;