为什么Perl允许模块之间相互“使用”的关系?

时间:2010-06-18 09:03:49

标签: perl

假设有两个相互使用的模块:

package a;
use b;
sub p {}

1;

package b;
use a;
1;

我认为编写如上所述的代码是系统错误的,因为这两个模块会无休止地将彼此的代码复制到自己,但我可以成功运行以下代码,这让我非常惊讶。你能不能向我解释这一切吗?

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

3 个答案:

答案 0 :(得分:15)

  

因为这两个模块会无休止地将彼此的代码复制到自己

不,他们不会,因为你用代码证明工作让你感到惊讶。 Perl在%INC中保留了已加载userequire的模块的记录,如果use d或require,则不会尝试重新加载它们再一次。

答案 1 :(得分:9)

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

对于use

require基本上是一个拉皮条的require和perldoc states要求包含库文件(如果尚未包含它) 。那里没问题。

do是另一回事。它执行文件,或多或少像eval或C #include。通过do相互包容应该是致命的。

答案 2 :(得分:7)

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