我刚刚注意到这是由 Catalyst.pl
生成的。显然,这是一种未经注释的黑客行为。设置这样一个版本字符串有什么好处?我甚至无法弄清他们试图做什么。
our $VERSION = '0.01';
$VERSION = eval $VERSION;
在Perl中,版本号比较复杂。如果您想了解细节,请查看这篇优秀的概述文章。令人惊讶的是,有很多微妙的方式会导致错误发生......
但直接回答您的问题是,不同的东西需要不同的格式。例如,对于CPAN,您需要关注开发版本,以字符串形式表示。对于运行时,您需要将其视为数字。
考虑 $VERSION = "0.01_001"
的情况。eval
正确地将其转换为数字 0.01001
。
如果您想发布模块的“beta”或“alpha”版本,但不希望CPAN.pm将其列为最新版本,请在常规版本号后面使用“_”并至少加上2位数字,例如1.20_01。如果您这样做,建议使用以下惯用法:
- $VERSION = "1.12_01";
- $XS_VERSION = $VERSION;#仅在您有XS代码时需要
- $VERSION = eval $VERSION;
通过此技巧,MakeMaker将仅读取第一行,从而读取下划线,而perl解释器将评估$VERSION并将字符串转换为数字。稍后将$VERSION视为数字进行处理的操作将能够这样做,而无需引发关于$VERSION不是数字的警告。
eval函数将字符串"0.001_001"
转换成数字,遵循Perl数字字面量的规则(允许使用下划线以提高可读性)。结果是数字0.001001
。
没有使用eval时,该字符串将按照字符串转换规则转换为数字,该规则在遇到第一个非数字字符时停止。
例如:perl -e 'print "0.001_001" + 0'
our $VERSION = '0.01';
但是您真正希望$VERSION保存的是浮点数而不是字符串。
您可能会想阅读这篇文章,我知道我要去读了。
哦,亲爱的上帝,现在我记得为什么我使用
our $VERSION = 20100903;
样式版本号。那就太疯狂了。我喜欢Perl,但那是纯粹、精练、浓缩的疯狂。我不会试图总结David Golden的文章。你只需要阅读它并哭泣。
version.pm
变体)。 - Evan Carroll