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

Eva*_*oll 20 perl version catalyst

我只是注意到了由此产生的Catalyst.pl.这显然是某种未经注释的黑客攻击.设置这样的版本字符串有什么好处?我甚至无法弄清楚他们想要做什么.

our $VERSION = '0.01';
$VERSION = eval $VERSION;
Run Code Online (Sandbox Code Playgroud)

szb*_*int 25

Perl中的版本号很复杂.对于那些寻找血腥细节的人来说,这是一个很好的概述.你可能会惊讶地发现有多少微妙的方法可以解决问题......

但问题的直接答案是,不同的东西需要不同的格式.对于CPAN,您关心开发版本,例如,作为字符串.对于运行时,您将它们视为数字.

考虑一下这种情况$VERSION = "0.01_001".eval将其0.01001正确转换为数字.

  • 我的天,我不知道 perl 版本如此可怕。+1 为伟大的文章。 (2认同)

too*_*lic 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不是数字的警告.


Eug*_*ash 6

eval将字符串"0.001_001"转换为数字,遵循Perl数字文字的规则(允许下划线表示易读性).结果是数字0.001001.

如果没有eval,则字符串将转换为遵循用于转换字符串的规则的数字,该字符串将停在第一个非数字字符处.

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


Cha*_*ens 5

我可能会错误地记住这一点,但我认为一些自动代码解析器喜欢看到代码行:

 our $VERSION = '0.01';
Run Code Online (Sandbox Code Playgroud)

但是你真的想要$ VERSION来保持一个浮点而不是一个字符串.

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

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

our $VERSION = 20100903;
Run Code Online (Sandbox Code Playgroud)

风格版本号.那只是疯了.我喜欢Perl,但那是纯粹的,精致的,浓缩的疯狂.我不会试图总结David Golden的文章.你只需要阅读并哭泣.

  • 在回答"你讨厌自己喜欢的编程语言的5件事情是什么?"时,版本号对我来说是前三名. (2认同)