在一些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