导出的 perl 模块子例程不可用
Exported perl module subroutines are not available
假设我有 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
。
我的问题是为什么Common模块导出的子程序在Validator模块中不可用?
我正在使用 perl 5.22.0。
因为Validator.pm
在定义@Common::EXPORT
之前加载和处理。
一些解决方法是
在 Common.pm
的 "compile phase" 期间和加载 Validator.pm
之前定义 @Common::EXPORT
# Common.pm
...
BEGIN { our @EXPORT = qw(validate inArray) }
use Validator;
...
在 Common.pm
的 "run phase" 期间和定义 @Common::EXPORT
之后加载 Validator.pm
# Common.pm
...
our @EXPORT = qw(validate inArray);
require Validator;
Validator->import;
...
假设我有 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
。
我的问题是为什么Common模块导出的子程序在Validator模块中不可用?
我正在使用 perl 5.22.0。
因为Validator.pm
在定义@Common::EXPORT
之前加载和处理。
一些解决方法是
在
Common.pm
的 "compile phase" 期间和加载Validator.pm
之前定义@Common::EXPORT
# Common.pm ... BEGIN { our @EXPORT = qw(validate inArray) } use Validator; ...
在
Common.pm
的 "run phase" 期间和定义@Common::EXPORT
之后加载Validator.pm
# Common.pm ... our @EXPORT = qw(validate inArray); require Validator; Validator->import; ...