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

时间:2017-07-28 07:36:32

标签: perl

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

  

“configureTheRepository”不会被ABC :: Config模块`导出。

这是调用堆栈。

Operation.pm

    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;

Config.pm

    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;

请让我知道我犯了哪些错误。

1 个答案:

答案 0 :(得分:3)

存在循环依赖。 use语句在编译时完成。这意味着在运行任何实际代码之前。因此,当您启动程序时,它首先要进入ABC::Operation,将会发生以下情况:

  • 扫描ABC :: use语句的操作
  • 加载Term :: ANSIColor
    • 解析切换到Term :: ANSIColor
    • 扫描术语:: ANSIColor用于use语句......
  • 解析切换回ABC :: Operation
  • load File :: Basename
    • 解析切换到File :: Basename
    • 扫描文件::基本名称
  • 解析切换回ABC :: Operation
  • ......其中几个
  • 加载ABC :: Config
    • 解析切换到ABC :: Config
    • 扫描ABC ::配置use语句...
  • 将女巫解析回ABC :: Operation
      来自Term :: ANSIColor,File :: Basename,Exporter和Cwd的
    • import内容;这些不会再次加载,因为Perl之前已经加载过它们。它只将符号导入当前的ABC :: Config命名空间
    • 来自ABC :: Config的
    • import函数commonFunc;再次,这也已经加载,所以它不会再次加载
    • 抛出错误,因为此时ABC :: Config尚未完成解析,并且尚未导出commonFunc符号

这有点令人困惑,但这表明您的架构已经崩溃。如果事情很普遍,他们肯定会在一个共同的包装中。但是那个常见的包不能使用任何使用它的东西。如果是这种情况,无论使用它还是根据定义变得普遍。

解决方案是重新考虑哪些功能在哪里。找到最小的部件,并将它们放在一个包装中。这是每个其他包共享的东西。然后在需要的地方使用它。接下来使用它的东西不应该互相带入。只有最后一个层次才能将它们全部组合在一起。出于某种原因,依赖树称为树。在那里有一个圆圈是行不通的。