2010-04-08 57 views
2

我有2个Perl模块,每个模块使用第二个即 Module1.pm进口2个模块,使用

使用单词数

Module2.pm

使用模块1

什么发生在当我加载使用 时使用Module1的这两个模块的背景; 使用Module2;

有人可以解释什么发生在背景上,为什么我不进入无限循环?

+1

当你尝试了什么事? – 2010-04-08 19:10:18

+0

如果你处于这种状况,我建议你应该看看你目前的设计,因为它已经坏了。库中的循环依赖只是错误的。在像Perl这样的解释型语言中,你可能会得到它,但它不适用于编译语言。在这种情况下,您应该考虑重新设计受影响的模块。 – Htbaa 2010-04-09 14:50:23

回答

10

你不陷入无限循环,因为特殊的哈希%INC的:

%INC
哈希%INC包含通过dorequire,或use运营商包括每个文件名条目。关键是您指定的文件名(将模块名称转换为路径名),该值是找到的文件的位置。 require运算符使用此散列来确定是否已包含特定文件。

此外,请记住use Module LIST相当于

BEGIN { require Module; Module->import(LIST); } 

因此,当主程序使用Module1,按以下顺序发生:

  1. require Module1(从包main
  2. require Module2 (来自包Module 1
  3. require Module1(什么也不做,因为Module1已经在%INC
  4. Module1->import(成包Module2
  5. Module2->import(成包Module1
  6. Module1->import(成包main