2010-06-18 80 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