我在/my_project/ABC/
下创建了Perl模块。 ABC
文件夹包含三个子例程模块:Build.pm
,Config.pm
和Operation.pm
。 Operation.pm
中有一个公共子例程,我需要从Config.pm
访问,但当我尝试抛出时
“configureTheRepository”不会被ABC :: Config模块`导出。
这是调用堆栈。
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;
请让我知道我犯了哪些错误。
答案 0 :(得分:3)
存在循环依赖。 use
语句在编译时完成。这意味着在运行任何实际代码之前。因此,当您启动程序时,它首先要进入ABC::Operation
,将会发生以下情况:
use
语句的操作use
语句...... use
语句... import
内容;这些不会再次加载,因为Perl之前已经加载过它们。它只将符号导入当前的ABC :: Config命名空间import
函数commonFunc
;再次,这也已经加载,所以它不会再次加载commonFunc
符号这有点令人困惑,但这表明您的架构已经崩溃。如果事情很普遍,他们肯定会在一个共同的包装中。但是那个常见的包不能使用任何使用它的东西。如果是这种情况,无论使用它还是根据定义变得普遍。
解决方案是重新考虑哪些功能在哪里。找到最小的部件,并将它们放在一个包装中。这是每个其他包共享的东西。然后在需要的地方使用它。接下来使用它的东西不应该互相带入。只有最后一个层次才能将它们全部组合在一起。出于某种原因,依赖树称为树。在那里有一个圆圈是行不通的。