perl 基础的疑问 use
它有点类似于我的另一个问题 Perl: Two packages in same file...
考虑一个 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";
}
Module1.pm
package Module1;
use strict;
use Exporter;
use INCLUDES; #####=> INCLUDES.pm 'use'd
our @ISA = qw(Exporter);
our @EXPORT = qw();
1;
Module2.pm
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 文档, Module1 & Module2 中的
use INCLUDES;
=> BEGIN {require 'INCLUDES.pm'; 'INCLUDES'->import();}
。所以,import()
也应该在 Module1.pm 和 Module2.pm 中调用。我希望输出如下所示,
预期输出 ??
D:\Do_analysis>Script.pl
INCLUDES imported to main
INCLUDES imported to Module1
INCLUDES imported to Module2
但是为什么执行不及预期呢?
更新
这就是我想要通过拥有 INCLUDES.pm 文件来实现的目标。
请注意:
PACKAGE2
可能想要访问 PACKAGE3、PACKAGE4 等。而不是 use
分别在 PACKAGE2
内的所有模块,我想在所有其他模块中创建一个库 INCLUDES
和 use
它。这种方法有效吗?还是值得推荐的?
我很欣赏有关如何实现这一目标的任何想法。
谢谢!
最佳答案
如果你要搬家
use Module1;
use Module2;
下面
sub import { ... }
,你会得到预期的行为。问题是你执行
Module1.pm
在编译器甚至达到 sub import
之前在 INCLUDES.pm
.当
Module1.pm
use INCLUDES;
, Perl 说“哦,它已经加载了”(响应 require
)和“哦,它没有 import
”(响应 import
),因为 INCLUDES.pm
的部分会创建 import
还没有编译。 Module2.pm
相同.一般来说,如果你有一个相互包含的模块(直接或以其他方式),那么你做错了(在设计方面),你最终将不得不处理这些问题。您可能会发现 Mini-Tutorial: Mutual Use of Exporting Modules在处理这些问题时很有用。
关于Perl `use` - 导入没有被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736605/