说我有3个perl文件。
run.pl
#!/usr/bin/perl
use strict;
use warnings;
use Common;
validate(); # no need of Common::validate()
Common.pm
package Common;
use strict;
use warnings;
use Exporter qw(import);
use Validator;
our @EXPORT = qw(validate inArray);
sub validate
{
Validator::doSomething();
}
sub inArray
{
print("HERE\n");
}
return 1;
Validator.pm
package Validator;
use strict;
use warnings;
use Common;
sub doSomething
{
inArray(); # only Common::inArray() works here, why?
}
return 1;
运行时输出为:Undefined subroutine &Validator::inArray called at Validator.pm line 10.
如果我改变
sub doSomething
{
inArray();
}
到
sub doSomething
{
Common::inArray();
}
那么结果应该是HERE
。
我的问题是,为什么在验证器模块中不可用“通用”模块导出的子例程?
我正在使用perl 5.22.0。
答案 0 :(得分:5)
因为Validator.pm
在定义@Common::EXPORT
之前已加载并处理。
某些解决方法是
在@Common::EXPORT
的“编译阶段”和加载Common.pm
之前定义Validator.pm
# Common.pm
...
BEGIN { our @EXPORT = qw(validate inArray) }
use Validator;
...
在Validator.pm
的“运行阶段”和定义Common.pm
之后加载@Common::EXPORT
# Common.pm
...
our @EXPORT = qw(validate inArray);
require Validator;
Validator->import;
...