如何在Perl中调用另一个模块子模块中的一个模块子模块

如何在Perl中调用另一个模块子模块中的一个模块子模块,perl,Perl,我已经在/my_project/ABC/下创建了Perl模块。ABC文件夹包含三个子例程模块:Build.pm、Config.pm和Operation.pm。Operation.pm中有一个公共子例程,我需要从Config.pm访问它,但是当我尝试时,我抛出了 配置存储不是由ABC::Config模块“”导出的 这是调用堆栈 下午六时 Config.pm 请告诉我是在哪里出错的。存在循环依赖关系。use语句在编译时完成。这意味着在运行任何实际代码之前。因此,当您启动程序时,它所做的第一件事就是进

我已经在/my_project/ABC/下创建了Perl模块。ABC文件夹包含三个子例程模块:Build.pm、Config.pm和Operation.pm。Operation.pm中有一个公共子例程,我需要从Config.pm访问它,但是当我尝试时,我抛出了

配置存储不是由ABC::Config模块“”导出的

这是调用堆栈

下午六时 Config.pm
请告诉我是在哪里出错的。

存在循环依赖关系。use语句在编译时完成。这意味着在运行任何实际代码之前。因此,当您启动程序时,它所做的第一件事就是进入ABC::Operation,将发生以下情况:

扫描ABC::操作以查找use语句 加载项::ANSIColor 解析切换到Term::ANSIColor 扫描术语::ANSIColor for use语句。。。 解析切换回ABC::操作 加载文件::Basename 解析切换到File::Basename 扫描文件::Basename 解析切换回ABC::操作 ... 再来两杯 加载ABC::Config 解析切换到ABC::Config 扫描ABC::Config以查找use语句。。。 将开关解析回ABC::操作 从Term::ANSIColor、File::Basename、Exporter和Cwd导入内容;这些文件不会再次加载,因为Perl以前已经加载了它们。它只将符号导入当前ABC::Config命名空间 从ABC::Config导入函数commonFunc;同样,它也已经被加载,所以它不会再次加载 抛出错误,因为此时ABC::Config尚未完成解析,并且尚未导出commonFunc符号 这有点令人困惑,但这表明您的体系结构已被破坏。如果事情是共同的,它们肯定会在一个共同的包中。但这个通用包不能使用任何使用它的东西。如果是这样的话,使用它的任何东西在定义上也变得很常见


解决办法是重新思考哪些功能可以发挥作用。找到可能最小的零件,并将它们放在一个包装中。这是每个其他包共享的东西。然后在需要的地方使用它。接下来使用这个的东西不应该互相牵扯进来。只有最后一个级别才能将所有这些级别合并。依赖关系树之所以称为tree是有原因的。在其中有一个圆圈是不可行的。

Perl中的注释是用完成的,而不是//。这是一个空的正则表达式模式。Operation.pm中是否有导出器或任何其他导出机制?它不会仅仅因为您声明了@export而导出。@simbabque否,但通过这种方式,我可以在我的操作中调用Config subs。我不相信这一点。使用ABC::Config实际上调用ABC::Config->import。如果其中没有导入子项,则无法导入任何内容。@EXPORT在默认情况下不是Perl所拥有的,它是由Exporter定义的接口,您通常将其用作模块的基类。所以这是行不通的。显示您的真实代码。谢谢。我创建了一个CommonUtils包,并将共享代码放在那里,它成功了。
    package ABC::Operation;

    use strict;
    use warnings;

    use Term::ANSIColor qw(:constants);
    use File::Basename qw(dirname);
    use Exporter qw(import);
    use Term::ANSIColor qw( colored );
    use Data::Dumper qw(Dumper);
    use JSON::PP;
    use File::Basename qw(dirname);
    use Cwd  qw(abs_path);
    use ABC::Config qw(configureTheRepository);

    our @EXPORT = qw(commonFunc)

   sub commonFunc{
      #handle logic
    }
1;
    package ABC::Config;

    use strict;
    use warnings;

    use Term::ANSIColor qw(:constants);
    use File::Basename qw(dirname);
    use Exporter qw(import);
    use Cwd  qw(abs_path);
    use Cwd  qw(abs_path);
    use ABC::Operation qw(commonFunc); #Compilation failed when i insert this line.if i removed this my script will execute and but in runtime throws undefined commonFunc.

   our @EXPORT = qw(configureTheRepository);

   sub configureTheRepository{
      #handle logic
    }

1;