Perl`use`-import不会被调用两次吗?
perl基础知识中的疑问Perl`use`-import不会被调用两次吗?,perl,package,perl-module,Perl,Package,Perl Module,perl基础知识中的疑问使用 这与我的另一个问题有些相似 考虑一个perl脚本: Script.pl use INCLUDES; 包括.pm package INCLUDES; use Exporter; ############# MY DOUBT STARTS HERE ############### use Module1; use Module2; ################################################## our @ISA = qw(Ex
使用
这与我的另一个问题有些相似
考虑一个perl脚本:
Script.pl
use INCLUDES;
包括.pm
package INCLUDES;
use Exporter;
############# MY DOUBT STARTS HERE ###############
use Module1;
use Module2;
##################################################
our @ISA = qw(Exporter);
our @EXPORT = qw();
sub import {
print 'INCLUDES imported to ' . caller . "\n";
}
package Module1;
use strict;
use Exporter;
use INCLUDES; #####=> INCLUDES.pm 'use'd
our @ISA = qw(Exporter);
our @EXPORT = qw();
1;
package Module2;
use strict;
use Exporter;
use INCLUDES; #####=> INCLUDES.pm 'use'd
our @ISA = qw(Exporter);
our @EXPORT = ();
1;
模块1.pm
package INCLUDES;
use Exporter;
############# MY DOUBT STARTS HERE ###############
use Module1;
use Module2;
##################################################
our @ISA = qw(Exporter);
our @EXPORT = qw();
sub import {
print 'INCLUDES imported to ' . caller . "\n";
}
package Module1;
use strict;
use Exporter;
use INCLUDES; #####=> INCLUDES.pm 'use'd
our @ISA = qw(Exporter);
our @EXPORT = qw();
1;
package Module2;
use strict;
use Exporter;
use INCLUDES; #####=> INCLUDES.pm 'use'd
our @ISA = qw(Exporter);
our @EXPORT = ();
1;
模块2.pm
package INCLUDES;
use Exporter;
############# MY DOUBT STARTS HERE ###############
use Module1;
use Module2;
##################################################
our @ISA = qw(Exporter);
our @EXPORT = qw();
sub import {
print 'INCLUDES imported to ' . caller . "\n";
}
package Module1;
use strict;
use Exporter;
use INCLUDES; #####=> INCLUDES.pm 'use'd
our @ISA = qw(Exporter);
our @EXPORT = qw();
1;
package Module2;
use strict;
use Exporter;
use INCLUDES; #####=> INCLUDES.pm 'use'd
our @ISA = qw(Exporter);
our @EXPORT = ();
1;
输出
D:\Do_analysis>Script.pl
INCLUDES imported to main
根据perl文档,use包括:代码>在Module1&Module2=>开始{require'INCLUDES.pm';'INCLUDES'->import();}
。因此,应该在Module1.pm和Module2.pm中调用import()
我希望输出如下所示
预期产出
D:\Do_analysis>Script.pl
INCLUDES imported to main
INCLUDES imported to Module1
INCLUDES imported to Module2
但为什么执行情况不如预期
已更新
这就是我试图通过拥有INCLUDES.pm文件来实现的目标
请注意:PACKAGE2
可能希望访问PACKAGE3、PACKAGE4等。我想创建一个库包括并在所有其他模块中使用它,而不是分别使用PACKAGE2
中的所有模块
这种方法有效吗?还是值得推荐
我很感激任何关于如何实现这一目标的想法。
谢谢 如果你要搬家
use Module1;
use Module2;
在子导入{…}
下面,您将获得预期的行为
问题是在编译器到达INCLUDES.pm
中的sub-import
之前执行Module1.pm
当Module1.pm
使用INCLUDES时代码>,Perl说“哦,它已经被加载了”(响应要求)和“哦,它没有导入
”(响应导入
),因为中包含.pm的那部分本来会创建导入
,但尚未编译。与模块2.pm相同
一般来说,如果您有一个包含彼此的模块(直接或其他),那么您就做错了(在设计方面),您将不得不处理这些问题。您可能会发现处理这些问题很有用。模块之间存在循环依赖关系main
使用INCLUDES
,INCLUDES
使用Module1
,Module1
使用INCLUDES
(Module2
在这里基本上是无关的,除了与Module1
的作用相同)。如果perl做了这种幼稚的事情,这将导致无限循环(或者至少是堆栈溢出),因为每次perl试图编译INCLUDES
,它都会导致编译模块1
,而每次perl试图编译模块1
,它都会导致编译INCLUDES
由于我们不希望发生这种情况,perl必须做一些不同的事情。相反,它所做的是忽略编译已编译或正在编译的模块的任何请求。因此,事件的流程是:
Perl开始编译script.pl
,并进入包main
Perl看到使用包含代码>,加载INCLUDES.pm
,并开始编译它
在第行<代码>包装包括:代码>,perl进入包包含的
Perl看到使用Module1
,加载Module1.pm
,并开始编译它
在包模块1
行,perl输入包模块1
Perl看到的用法包括:代码>,意识到它已经在编译INCLUDES.pm的过程中,并且不再尝试再次编译它
由于的使用,包括:
perl试图调用INCLUDES->import
,但导入方法尚未定义(我们在步骤4暂停编译INCLUDES
,开始编译Module1
)
编译模块1
完成,我们回到包含
Perl调用Module1->import
fromINCLUDES
编译包括
完成,包括使用模块2
和子导入的定义。Perl返回到main
从main
调用INCLUDES->import
,并打印消息
编译script.pl
完成
script.pl
在运行时无事可做,perl退出
顺便说一句,这闻起来像是糟糕的设计。在好的代码中很少需要循环模块依赖关系,而仅仅为了加载一堆其他模块(尤其是导出模块)而存在的模块也值得怀疑。看起来你正在构建一个“一大堆垃圾”的模式对我能理解。但我仍然不知道,在给定的图片中是否有其他方法来实现架构。感谢您为编译过程提供了一些启示。我已经更新了我的问题关于我想做什么。我不明白我应该在哪里做使用/要求
。