我正在模块化我的代码,但是当我从它的原始模块中移出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
答案 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;
}
并且您的代码应该可以使用。
另请注意,子例程声明(如while
或for
循环)不一个语句,所以不需要也不应该有分号它