导出的 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;
    ...