- 论坛徽章:
- 46
|
本帖最后由 zhlong8 于 2017-09-13 21:46 编辑
你知道 Perl 自带个模块叫 B 吗?
假设你解决名字的问题那么
如果用户 use A; 按实际执行顺序是
编译A.pm ->
遇到 use B;语句 ->
编译B.pm ->
B 中遇到 use A; ->
此时A在编译,无需重复编译 ->
执行 A->import('a_call') ->
此时 @ISA='Exporter'; @EXPORT='a_call'; 还没开始执行,因为A编译都还没完成,怎么执行. 修改代码 use base 'Exporter'; BEGIN { @ EXPORT = 'a_call'; } 放在 A.pm 的 use B; 之前 ->
A中继承来 Exporter 的 import 方法,A->import('a_call') 可以正确执行,导入正确的符号 a_call 到 package B ->
B 编译完找到符号a_call(), 执行B.pm ->
A 中执行 B->import('b_call') 成功 ->
编译A中 use B 之后的代码 ->
A 编译完成,执行 A 模块代码 ->
客户 use A; 完成整个 A B 模块的导入。关键在于分清编译和执行两步顺序,use A qw(args); 等价于 BEGIN{ require A; A->import(qw(args)); }
|
|