在一些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版本,它被拉出,但無論如何 - 它是在這裏 - 所以不知道爲什麼這是好(或壞):)
在一些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版本,它被拉出,但無論如何 - 它是在這裏 - 所以不知道爲什麼這是好(或壞):)
這是其中之一每個人都一直做的事情,不記得爲什麼!
實質上,這是因爲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::VERSION
是BEGIN
塊外定義,它不會被設置,直到所有use
報表已經完成之後,所以來不及其他模塊做檢查版本上Module
。
我希望這很清楚。我不禁想到必須有一個更簡單的解釋,但沒有想到。
小心在你看到這個的地方包括具體的例子嗎?簡短的回答是,其他初始化步驟可以在錯誤消息中引用它,而不會被設置。此外,即使它可能是多餘的,它也不會造成任何傷害。我相信還有一個與版本號解析模塊有關的原因,但我忘記了這些細節。 – Miller
@Miller不明白你爲什麼需要具體的答案例子,但確定 - 增加了一個;) – jm666
因爲不同的模塊可能會出於不同的原因(有些可能只是複製和粘貼),所以它有助於說話關於特定情況。另外,當我看着實際的代碼時,我的大腦工作得更快;)我知道背後有一個歷史原因,但我還沒有記得它。 – Miller