比方说有一些互相利用对方两个模块:为什么Perl允许模块之间相互“使用”关系?
package a;
use b;
sub p {}
1;
package b;
use a;
1;
我认为这是系统错误写像上面的代码,因为这两个模块将对方的代码无休止地复制自己,但我可以成功运行下面的代码,这让我非常惊讶。你们有没有可以向我解释这一切?
#! /usr/bin/perl
use a;
a->p();
比方说有一些互相利用对方两个模块:为什么Perl允许模块之间相互“使用”关系?
package a;
use b;
sub p {}
1;
package b;
use a;
1;
我认为这是系统错误写像上面的代码,因为这两个模块将对方的代码无休止地复制自己,但我可以成功运行下面的代码,这让我非常惊讶。你们有没有可以向我解释这一切?
#! /usr/bin/perl
use a;
a->p();
,因为这两个模块将对方的代码不休复制到自己
不,他们不会像你通过工作让你吃惊的代码所示。 Perl的记录哪些模块已经加载了use
或require
并不会尝试重新加载他们,如果他们得到use
d或require
再次D IN %INC
的记录。
据我记得“使用”perl指令执行检查模块是否已经加载。它通过调用require()函数完成。所以,没有无尽的副本。
有(至少)三种不同的加载方式:use
,require
和do
。
use
基本上是一个拉皮条require
和的perldoc states为require
:要求,如果尚未列入它是一个库文件包含的需求。那里没有问题。
do
是一个不同的故事。它执行该文件并且或多或少地像eval
或C的#include
。通过do
共同包含应该是致命的。
“Use'ing模块不会复制任何东西,除非你设置了一个'@ EXPORT'或以其他方式复制具体的东西到另一个符号表。 – Ether 2010-06-18 15:05:54