BEGIN块中的Perl模块版本信息

jm6*_*666 3 perl

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

BEGIN {
    $Package::Name::VERSION = "N.N";
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑 - 在最新的模块版本中它被拔出,但无论如何 - 它在这里 - 所以想知道它为什么好(或坏):)

Bor*_*din 5

这是每个人一直做的事情之一,不记得为什么!

本质上是因为use语句允许多个模块同时进行编译,所以虽然它看起来像一个模块是完整的,但它可能刚刚开始编译.

正在编译的任何代码都可以$Module::VERSION通过使用继承的UNIVERSAL::VERSION子例程来检查值,该子例程在模块开始编译之前已经隐式定义.

请记住,如果Module.pm包含

use Another::Module;
Run Code Online (Sandbox Code Playgroud)

然后在编译Module.pmAnother/Module.pm将编译保留.

没有什么能阻止Another::Module从做

use Module 1.5;
Run Code Online (Sandbox Code Playgroud)

将调用Module::VERSION(1.5)(继承自UNIVERSAL::VERSION)以检查是否$Module::VERSION为1.5或更高.

如果$Module::VERSIONBEGIN块外部定义,则在所有use语句完成之后才会设置,因此其他模块进行版本检查的时间太晚Module.

我希望这很清楚.我不禁想到必须有一个更简单的解释,但没有任何想法.