2014-04-03 78 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