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

时间:2010-09-03 20:32:55

标签: perl version catalyst

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

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

4 个答案:

答案 0 :(得分:25)

Perl中的版本号很复杂。对于那些寻找血腥细节的人来说Here's an excellent overview。你可能会惊讶地发现有多少微妙的方法可以解决问题......

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

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

答案 1 :(得分:12)

来自perlmodstyle: Version numbering

  

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

     
      
  1. $ VERSION =“1.12_01”;
  2.   
  3. $ XS_VERSION = $ VERSION; #只有在拥有XS代码时才需要
  4.   
  5. $ VERSION = eval $ VERSION;
  6.         

    只有MakeMaker这个技巧   阅读第一行,从而阅读   强调,而perl翻译   将评估$ VERSION并转换   将字符串转换为数字。后来   将$ VERSION视为一个操作   数字将能够这样做   没有引发警告   $ VERSION不是数字。

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:5)

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

 our $VERSION = '0.01';

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

您可能需要阅读this article,我知道我要去。

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

our $VERSION = 20100903;

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