21

我刚刚注意到这个由Catalyst.pl. 这显然是某种未注释的 hack。像这样设置版本字符串有什么好处?我什至无法弄清楚他们想要做什么。

our $VERSION = '0.01';
$VERSION = eval $VERSION;
4

4 回答 4

26

Perl 中的版本号很复杂。对于那些寻找血腥细节的人来说,这是一个很好的概述。您可能会惊讶于有多少微妙的方法可以让事情出错......

不过,对您的问题的直接回答是,不同的事物需要不同的格式。对于 CPAN,您关心开发版本,例如,作为字符串。对于运行时,您将它们视为一个数字。

考虑 的情况$VERSION = "0.01_001"eval将其0.01001正确转换为数字。

于 2010-09-03T20:43:15.753 回答
12

来自perlmodstyle:版本编号

如果您想发布模块的“beta”或“alpha”版本,但不希望 CPAN.pm 将其列为最新版本,请在常规版本号后使用“_”,后跟至少 2 位数字,例如。1.20_01。如果这样做,建议使用以下成语:

  1. $VERSION = "1.12_01";
  2. $XS_VERSION = $版本;# 只有当你有 XS 代码时才需要
  3. $VERSION = 评估 $VERSION;

有了这个技巧,MakeMaker 将只读取第一行并因此读取下划线,而 perl 解释器将评估 $VERSION 并将字符串转换为数字。稍后将 $VERSION 视为数字的操作将能够这样做,而不会引发有关 $VERSION 不是数字的警告。

于 2010-09-03T20:53:33.543 回答
6

eval 将字符串转换"0.001_001"为数字,遵循 Perl 数字文字的规则(允许下划线以提高可读性)。结果是数字0.001001

如果没有 eval,则字符串将按照转换字符串的规则转换为数字,该规则在第一个非数字字符处停止。

例如:perl -e 'print "0.001_001" + 0'

于 2010-09-03T20:44:07.147 回答
5

我可能记错了,但我认为一些自动代码解析器喜欢查看代码行:

 our $VERSION = '0.01';

但是你真的希望 $VERSION 保存一个浮点数而不是一个字符串。

你可能想读这篇文章,我知道我会去的。

哦,天哪,现在我记得我为什么使用

our $VERSION = 20100903;

样式版本号。那简直是疯了。我喜欢 Perl,但那是纯粹的、精致的、集中的精神错乱。我不会试图总结 David Golden 的文章。你只需要阅读它并哭泣。

于 2010-09-03T20:39:47.937 回答