1

我编写了一个简单的 Perl 程序(Driver.pl),它传递array by reference并调用子例程add incalculate.pm模块。

calculate.pm 模块将两个值 100 和 500 推送到数组中。

当我在 Driver.pl 文件中打印数组时,它什么也不打印。

驱动程序.pl 文件:

use calculate;
our @my_array;
sub init() {
    $x = 1;
    calculate::add($x, /@my_array);
}
init();
for (@my_array) {
    print $_; #Prints Nothing.
}

计算.pm

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

4 回答 4

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

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

  • 引用运算符是\nor /
  • 循环是forforeach但从不for each。有一个each函数可以让我们遍历集合,但这在这里没有用。
  • 不要使用类似的原型(),除非你确切地知道它们的作用、它们的含义以及为什么必须在这里使用它们。
  • 将明确的包声明放入您的库文件中。

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

  • 用大写的名字命名你的包——小写的名字是为“pragmas”保留的。
  • 用 声明所有变量my,除非你真的需要全局/动态变量。你没有。

并且后换行print不会受到伤害。

在我们的add函数中,我们收到一个数组引用。(如果您了解 C++:Perl 引用就像指针,而不像 C++ 引用)。引用是标量,所以我们把它放到$arrayref. 为了得到实际的数组,我们像取消引用它一样@$arrayref——但不要复制,或者你没有操作原始数组。

您可以将剩余的参数放入数组中,例如my ($x, @list) = (1, 2)放入2数组中。但是在您的情况下, the2是一个数组引用!因此,它@list包含一个元素,它是我们的数组引用——但它不是同一个数组。

这仍然不是优雅的代码并且存在架构问题,但它现在至少应该可以编译。

于 2013-09-03T15:08:15.527 回答
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;and use warnings;是一个好习惯

于 2013-09-03T15:09:35.533 回答
2

假设拼写错误只是在此处复制代码的错误(例如/@my_array应该是\@my_array),您需要在 中获取数组引用add()而不是数组:

sub add(){
   my ($x, $arr) = @_;
   push (@$arr,100);  # or push( @{ $arr }, 100 );
   push (@$arr,200);
}
于 2013-09-03T15:05:10.943 回答
1
sub init {
   $x=1;
   calculate::add($x,\@my_array);
}

sub add {
   my ($x,$arr) = @_;
   push (@$arr,100);
   push (@$arr,200);
}
1;
于 2013-09-03T15:07:48.773 回答