繁体   English   中英

BEGIN块中的Perl模块版本信息

[英]Perl module version information in the BEGIN block

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

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

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

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

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

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

本质上是因为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或更高。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM