BEGIN块中的Perl模块版本信息

时间:2014-04-03 20:44:44

标签: perl

在一些CPAN模块中,我找到了下一个构造

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

将包版本信息放入BEGIN块后的理由是什么?

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

编辑 - 在most recent module版本中它已被撤出,但无论如何 - 它就在这里 - 所以想知道为什么它好(或坏):)

1 个答案:

答案 0 :(得分:5)

这是每个人都做过的事情之一,无法记住原因!

基本上是因为use语句允许同时编译多个模块,所以尽管看起来模块已经完成,但它可能刚刚开始编译。

正在编译的任何代码都可以使用继承的$Module::VERSION子例程检查UNIVERSAL::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

我希望这很清楚。我无法帮助思考必须有一个更简单的解释,但没有想到任何事情。