当我模块化我的代码时,“不是ARRAY引用”错误开始发生

时间:2013-01-11 00:42:52

标签: perl perl-module

我正在模块化我的代码,但是当我从它的原始模块中移出sub时,我收到以下错误:

Couldn't load application from file "foo.pl": Not an ARRAY reference at D.pm line 10.

这是原始文件。一切都好,

FormerC.pm

package FormerC;

use strict;

my %my_hash = ( key => 'value' );
my @my_array = qw( some strings inside array );

sub problematic_sub {
  my ($hash_ref, $array_ref) = @_;

  my @an_array = @$array_ref;

  return \@an_array;
};

sub uses_problematic_sub {
  problematic_sub(\%my_hash, \@my_array);
};

uses_problematic_sub();

1

这是两个新模块。有了这些我得到错误:

D.pm

package D;

use strict;

sub new { bless {}, shift };

sub problematic_sub {
  my ($hash_ref, $array_ref) = @_;

  my @an_array = @$array_ref;

  return \@an_array;
};

1

C.pm

package C;

use strict;

use D;
my $d = D->new;

my %my_hash = ( key => 'value' );
my @my_array = qw( some strings inside array );

sub uses_problematic_sub {
  $d->problematic_sub(\%my_hash, \@my_array);
};

uses_problematic_sub();

1

2 个答案:

答案 0 :(得分:5)

您曾经将problematic_sub称为子

problematic_sub(\%my_hash, \@my_array);

但你现在打电话的方法是:

$d->problematic_sub(\%my_hash, \@my_array);

由于您没有将problematic_sub编码为方法,因此这是不正确的。您还需要将problematic_sub的参数更改为以下内容:

my ($self, $hash_ref, $array_ref) = @_;

答案 1 :(得分:4)

使用Exporter模块将子例程名称导出到调用代码的命名空间中可能会更好。你在这里写的是面向对象的模块,但是对象只是子程序的集合,不需要面向对象的支持。

问题在于方法调用如

$d->problematic_sub(\%my_hash, \@my_array)

隐式传递对象作为第一个参数,因此它等同于

D::problematic_sub($d, \%my_hash, \@my_array)

您需要做的只是在子程序

中考虑到这一点
sub problematic_sub {

  my ($self, $hash_ref, $array_ref) = @_;

  my @an_array = @$array_ref;

  return \@an_array;
}

并且您的代码应该可以使用。

另请注意,子例程声明(如whilefor循环)一个语句,所以不需要也不应该有分号它