比方說有一些互相利用對方兩個模塊:爲什麼Perl允許模塊之間相互「使用」關係?
package a;
use b;
sub p {}
1;
package b;
use a;
1;
我認爲這是系統錯誤寫像上面的代碼,因爲這兩個模塊將對方的代碼無休止地複製自己,但我可以成功運行下面的代碼,這讓我非常驚訝。你們有沒有可以向我解釋這一切?
#! /usr/bin/perl
use a;
a->p();
比方說有一些互相利用對方兩個模塊:爲什麼Perl允許模塊之間相互「使用」關係?
package a;
use b;
sub p {}
1;
package b;
use a;
1;
我認爲這是系統錯誤寫像上面的代碼,因爲這兩個模塊將對方的代碼無休止地複製自己,但我可以成功運行下面的代碼,這讓我非常驚訝。你們有沒有可以向我解釋這一切?
#! /usr/bin/perl
use a;
a->p();
,因爲這兩個模塊將對方的代碼不休複製到自己
不,他們不會像你通過工作讓你吃驚的代碼所示。 Perl的記錄哪些模塊已經加載了use
或require
並不會嘗試重新加載他們,如果他們得到use
d或require
再次D IN %INC
的記錄。
據我記得「使用」perl指令執行檢查模塊是否已經加載。它通過調用require()函數完成。所以,沒有無盡的副本。
有(至少)三種不同的加載方式:use
,require
和do
。
use
基本上是一個拉皮條require
和的perldoc states爲require
:要求,如果尚未列入它是一個庫文件包含的需求。那裏沒有問題。
do
是一個不同的故事。它執行該文件並且或多或少地像eval
或C的#include
。通過do
共同包含應該是致命的。
「Use'ing模塊不會複製任何東西,除非你設置了一個'@ EXPORT'或以其他方式複製具體的東西到另一個符號表。 – Ether 2010-06-18 15:05:54