0

有 3 个模块,因此它们通过模式 a -> b -> c -> a 相互使用。我无法编译这种情况。

例如,

我收到编译错误

"Throw" is not exported by the LIB::Common::Utils module
Can't continue after import errors at /root/bin/ppm/LIB/Common/EnvConfigMgr.pm line 13
BEGIN failed--compilation aborted at /root/bin/ppm/LIB/Common/EnvConfigMgr.pm line 13.

实用程序.pm

use Exporter qw(import);
our @EXPORT_OK = qw(
        GetDirCheckSum
        AreDirsEqual
        onError
        Throw);
use LIB::Common::Logger::Log;

日志.pm

use Log::Log4perl;

use LIB::Common::EnvConfigMgr qw/Expand/;

环境配置管理器.pm

use Exporter qw(import);

our @EXPORT = qw(TransformShellVars ExpandString InitSearchLocations);
our @EXPORT_OK = qw(Expand);

use LIB::Common::Utils qw/Throw/;

为什么它没有被编译以及如何使它工作?

4

1 回答 1

3

您需要使用require而不是use依赖循环中的某个位置,以延迟绑定。使用不导出任何内容的模块最方便,否则您需要编写显式import调用

在你的情况下LIB::Common::Logger::Log不使用Export,所以把

require LIB::Common::Logger::Log

intoLIB/Common/Utils.pm解决问题

您可以访问不起作用的代码,并且只需显示故障代码即可为我们节省大量时间。你忽略了两条要求更多信息的评论,所以我已经设置了这些文件

请注意,这段代码什么都不做:它只是编译

LIB/Common/Utils.pm

package LIB::Common::Utils;

use Exporter 'import';

our @EXPORT_OK = qw/
    GetDirCheckSum
    AreDirsEqual
    onError
    Throw
/;

require LIB::Common::Logger::Log;

sub GetDirCheckSum { }

sub AreDirsEqual { }

sub onError { }

sub Throw { }

1;

LIB/Common/Logger/EnvConfigMgr.pm

package LIB::Common::EnvConfigMgr;

use Exporter 'import';

our @EXPORT = qw/ TransformShellVars ExpandString InitSearchLocations /;
our @EXPORT_OK = 'Expand';

use LIB::Common::Utils 'Throw';

sub TransformShellVars { }

sub ExpandString { }

sub InitSearchLocations { }

sub Expand { }

1;

LIB/通用/记录器/Log.pm

package LIB::Common::Logger::Log;

use Log::Log4perl;

use LIB::Common::EnvConfigMgr 'Expand';

1;

主文件

use strict;
use warnings 'all';

use FindBin;
use lib $FindBin::Bin;

use LIB::Common::Utils;
于 2016-10-25T10:44:13.877 回答