Perl版本字符串:为什么要使用EVAL EXPR?

21

我刚刚注意到这是由 Catalyst.pl 生成的。显然,这是一种未经注释的黑客行为。设置这样一个版本字符串有什么好处?我甚至无法弄清他们试图做什么。

our $VERSION = '0.01';
$VERSION = eval $VERSION;
4个回答

26

在Perl中,版本号比较复杂。如果您想了解细节,请查看这篇优秀的概述文章。令人惊讶的是,有很多微妙的方式会导致错误发生......

但直接回答您的问题是,不同的东西需要不同的格式。例如,对于CPAN,您需要关注开发版本,以字符串形式表示。对于运行时,您需要将其视为数字。

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


2
我的天啊,我不知道 Perl 的版本会这么糟糕。对于这篇好文章点个赞。 - JSBձոգչ
谢谢你提供的链接,那是我读过的最好的Perl博客文章之一。它很好地解释了这个问题(但它确实需要更新version.pm变体)。 - Evan Carroll

12

来自perlmodstyle:版本编号

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

  1. $VERSION = "1.12_01";
  2. $XS_VERSION = $VERSION;#仅在您有XS代码时需要
  3. $VERSION = eval $VERSION;

通过此技巧,MakeMaker将仅读取第一行,从而读取下划线,而perl解释器将评估$VERSION并将字符串转换为数字。稍后将$VERSION视为数字进行处理的操作将能够这样做,而无需引发关于$VERSION不是数字的警告。


6

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

没有使用eval时,该字符串将按照字符串转换规则转换为数字,该规则在遇到第一个非数字字符时停止。

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


5
我可能记错了,但我认为一些自动化代码解析器喜欢看到以下代码行:
 our $VERSION = '0.01';

但是您真正希望$VERSION保存的是浮点数而不是字符串。

您可能会想阅读这篇文章,我知道我要去读了。

哦,亲爱的上帝,现在我记得为什么我使用

our $VERSION = 20100903;

样式版本号。那就太疯狂了。我喜欢Perl,但那是纯粹、精练、浓缩的疯狂。我不会试图总结David Golden的文章。你只需要阅读它并哭泣。


2
当我回答“你最讨厌你最喜欢的编程语言的五件事是什么?”时,版本号排在前三位。 - szbalint
@szbalint:那似乎是一个没有经过深思熟虑的前五名。 - Evan Carroll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接