导出的perl模块子例程不可用

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.

mob*_*mob 5

因为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)