假设有两个相互使用的模块:
package a;
use b;
sub p {}
1;
package b;
use a;
1;
我认为编写如上所述的代码是系统错误的,因为这两个模块会无休止地将彼此的代码复制到自己,但我可以成功运行以下代码,这让我非常惊讶。你能不能向我解释这一切吗?
#! /usr/bin/perl
use a;
a->p();
答案 0 :(得分:15)
因为这两个模块会无休止地将彼此的代码复制到自己
不,他们不会,因为你用代码证明工作让你感到惊讶。 Perl在%INC
中保留了已加载use
或require
的模块的记录,如果use
d或require
,则不会尝试重新加载它们再一次。
答案 1 :(得分:9)
(至少)有三种不同的加载方式:use
,require
和do
。
use
, require
基本上是一个拉皮条的require
和perldoc states:要求包含库文件(如果尚未包含它) 。那里没问题。
do
是另一回事。它执行文件,或多或少像eval
或C #include
。通过do
相互包容应该是致命的。
答案 2 :(得分:7)
据我记得“use”perl指令执行检查模块是否已经加载。这是通过调用require()函数完成的。所以,没有无尽的副本。