2014-04-03 76 views
3

在一些CPAN模塊,我發現下一個建設Perl模塊,版本信息

BEGIN { 
    $Package::Name::VERSION = "N.N"; 
} 

這背後把包的版本信息到BEGIN塊的理由?

例如:http://cpansearch.perl.org/src/JSWARTZ/Poet-0.12/lib/Poet/Cache.pm

編輯 - 在most recent module版本,它被拉出,但無論如何 - 它是在這裏 - 所以不知道爲什麼這是好(或壞):)

+0

小心在你看到這個的地方包括具體的例子嗎?簡短的回答是,其他初始化步驟可以在錯誤消息中引用它,而不會被設置。此外,即使它可能是多餘的,它也不會造成任何傷害。我相信還有一個與版本號解析模塊有關的原因,但我忘記了這些細節。 – Miller

+0

@Miller不明白你爲什麼需要具體的答案例子,但確定 - 增加了一個;) – jm666

+0

因爲不同的模塊可能會出於不同的原因(有些可能只是複製和粘貼),所以它有助於說話關於特定情況。另外,當我看着實際的代碼時,我的大腦工作得更快;)我知道背後有一個歷史原因,但我還沒有記得它。 – Miller

回答

5

這是其中之一每個人都一直做的事情,不記得爲什麼!

實質上,這是因爲use語句允許同時編譯多個模塊,所以雖然看起來像一個模塊是完整的,但它可能只是剛剛開始編譯。

正在編譯的任何代碼都可以使用繼承的UNIVERSAL::VERSION子例程檢查$Module::VERSION的值,該子例程在模塊甚至開始編譯之前已經隱式定義。

記住,如果Module.pm包含

use Another::Module; 

隨後的Module.pm編譯擱置而Another/Module.pm編譯。

沒有什麼可以阻止Another::Module從做

use Module 1.5; 

它將調用Module::VERSION(1.5)(從UNIVERSAL::VERSION繼承)檢查$Module::VERSION是1.5或更大。

如果$Module::VERSIONBEGIN塊外定義,它不會被設置,直到所有use報表已經完成之後,所以來不及其他模塊做檢查版本上Module

我希望這很清楚。我不禁想到必須有一個更簡單的解釋,但沒有想到。

+0

因此,在尋找「使用特定模塊版本」時會有所幫助。大大解釋 - 只是想知道,爲什麼Johnatan在最新的模塊版本中從BEGIN中取出VERSION ...但這對你來說不是個問題:) :) thanx。 – jm666

+0

這是真的。 – Miller

+0

@Miller:這與'Exporter'無關:你想看'use.pm'。 – Borodin