jbr*_*htl 2 perl perl-module circular-dependency
说我有3个perl文件.
run.pl
#!/usr/bin/perl
use strict;
use warnings;
use Common;
validate(); # no need of Common::validate()
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
Validator.pm
package Validator;
use strict;
use warnings;
use Common;
sub doSomething
{
inArray(); # only Common::inArray() works here, why?
}
return 1;
Run Code Online (Sandbox Code Playgroud)
运行时输出为: Undefined subroutine &Validator::inArray called at Validator.pm line 10.
如果我改变
sub doSomething
{
inArray();
}
Run Code Online (Sandbox Code Playgroud)
至
sub doSomething
{
Common::inArray();
}
Run Code Online (Sandbox Code Playgroud)
然后结果是预期的HERE.
我的问题是为什么Common模块导出的子程序在Validator模块中不可用?
我正在使用perl 5.22.0.
因为Validator.pm在@Common::EXPORT定义之前加载和处理.
一些解决方法要么是
@Common::EXPORT在加载Common.pm之前和之前的"编译阶段"中定义Validator.pm
# Common.pm
...
BEGIN { our @EXPORT = qw(validate inArray) }
use Validator;
...
Run Code Online (Sandbox Code Playgroud)定义Validator.pm了"运行阶段"期间Common.pm和之后的负载@Common::EXPORT
# Common.pm
...
our @EXPORT = qw(validate inArray);
require Validator;
Validator->import;
...
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |