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

时间:2018-06-21 11:55:20

标签: perl perl-module circular-dependency

说我有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。

1 个答案:

答案 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;
    ...