gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:18:58 24 4
gpt4 key购买 nike

假设我有 3 个 perl 文件。

运行.pl

#!/usr/bin/perl
use strict;
use warnings;
use Common;

validate(); # no need of Common::validate()

通用.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;

验证器.pm

package Validator;

use strict;
use warnings;
use Common;

sub doSomething
{
inArray(); # only Common::inArray() works here, why?
}

return 1;

运行时输出为:在 Validator.pm 第 10 行调用的未定义子例程 &Validator::inArray。

如果我改变

sub doSomething
{
inArray();
}

sub doSomething
{
Common::inArray();
}

然后结果是预期的HERE

我的问题是为什么 Common 模块导出的子程序在 Validator 模块中不可用?

我正在使用 perl 5.22.0。

最佳答案

因为 Validator.pm 是在 @Common::EXPORT 定义之前加载和处理的。

一些解决方法是

  • Common.pm 的“编译阶段”和加载 Validator.pm 之前定义 @Common::EXPORT

    # Common.pm
    ...
    BEGIN { our @EXPORT = qw(validate inArray) }
    use Validator;
    ...
  • Common.pm 的“运行阶段”期间和 @Common::EXPORT 定义之后加载 Validator.pm

    # Common.pm
    ...
    our @EXPORT = qw(validate inArray);
    require Validator;
    Validator->import;
    ...

关于perl - 导出的 perl 模块子例程不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50967991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com