2010-06-18 144 views
8

比方说有一些互相利用对方两个模块:为什么Perl允许模块之间相互“使用”关系?

package a; 
use b; 
sub p {} 

1; 

package b; 
use a; 
1; 

我认为这是系统错误写像上面的代码,因为这两个模块将对方的代码无休止地复制自己,但我可以成功运行下面的代码,这让我非常惊讶。你们有没有可以向我解释这一切?

#! /usr/bin/perl 
use a; 
a->p(); 
+0

“Use'ing模块不会复制任何东西,除非你设置了一个'@ EXPORT'或以其他方式复制具体的东西到另一个符号表。 – Ether 2010-06-18 15:05:54

回答

15

,因为这两个模块将对方的代码不休复制到自己

不,他们不会像你通过工作让你吃惊的代码所示。 Perl的记录哪些模块已经加载了userequire并不会尝试重新加载他们,如果他们得到use d或require再次D IN %INC的记录。

7

据我记得“使用”perl指令执行检查模块是否已经加载。它通过调用require()函数完成。所以,没有无尽的副本。

9

有(至少)三种不同的加载方式:userequiredo

use基本上是一个拉皮条require和的perldoc statesrequire要求,如果尚未列入它是一个库文件包含的需求。那里没有问题。

do是一个不同的故事。它执行该文件并且或多或少地像eval或C的#include。通过do共同包含应该是致命的。

+1

'做'是邪恶的,最好避免。 – Ether 2010-06-18 16:18:03

+0

当你的目标是执行任意文件(哎,这是Perl的),而不是包括它作为一个包,那么'do'似乎是要走的路。也许它不适合这种情况;我只是记得那样,因为_Beginning Perl_在关于模块的章节中列出了'do'。 – musiKk 2010-06-18 17:15:05

+0

如果你的目标是运行任意文件,那么你可能要重新考虑你的设计。 – daotoad 2010-06-18 19:14:58

相关问题