现代声明使用哪个版本的Perl的方式是什么?

19

说到确定我们脚本所需的Perl版本,我们有多种选择,嗯,伙计,我们有很多选择:

use 5.010;
use 5.010_001;
use 5.10.0;
use v5.10;
use v5.10.0;

所有的都似乎可以工作。perlcritic会对除了前两个之外的所有代码进行抱怨。(不幸的是,v字符串似乎有这样的缺陷, 因为Perl 6希望你在Perl 6脚本中使用use v6;...)

那么,我们应该做什么来指示我们想要使用特定版本的perl呢?


请参见 https://dev59.com/q0jSa4cB1Zd3GeqPHrMB。 - Ether
相关但绝对是我们需要的“重复”类型,因为它们以完全不同的方式提问。 - Jeff Atwood
3个回答

9

实际上只有两种选项:十进制数和v-字符串。使用哪种形式在一定程度上取决于您想要“支持”的Perl版本,以便提供有意义的错误消息而不是语法错误。(v-字符串语法是在Perl 5.6中添加的。)被接受的最佳实践 - 这也是perlcritic强制执行的 - 是使用十进制表示法。您应该指定脚本所需的最低Perl版本才能正常运行。通常这意味着声明对主要发布中添加的语言功能的依赖,例如使用在5.10中添加的say函数。如果补丁级别对于脚本的正确行为很重要,则应包括它。例如,我的某些代码指定use 5.008001,因为它依赖于5.8.0存在的一个错误的修复,在5.8.1中得到了修复。


7

我只是使用类似于5.010_001的东西。我已经厌倦了处理本应该非常简单的版本字符串问题。由于我主要处理构建系统,所以我不断地与Module::Build的内部version.pm进行斗争,它与CPAN上的version.pm不同步。我认为现在情况大多好转了,但我有更好的事情要考虑。

最佳实践应该始终是做那些需要最少关注的事情,而且肯定不会比所带来的价值更加引人注目。在我看来,v-strings和点十进制数是一个巨大的干扰,没有额外的好处,浪费了很多宝贵的程序员时间,只是为了回到起点。

我还应该指出,Perl::Critic经常推广可疑的做法,以减少人们处理事情的方式。然而,这些做法经常会引起问题,使它们不是最佳的。这是其中之一。更现实的最佳实践是不要将Perl::Critic的合规性作为您的目标。在有用的情况下使用它,在这种情况下,不要在心理上浪费时间。


5

“现代”方法是使用以v开头的表单。然而,这可能并不是你真正想要做的。

Critic抱怨因为旧版本的Perl无法理解和与以v开头的表单友好地交互。然而,如果您的Perl版本支持它,v更易于阅读,因为您可以这样说:

use v5.10.1;

相较于...

use 5.010_001;

因此,在use文档中,提供了以下解决方法:
use 5.006; use v5.6.1;

注意:我认为这里的文档有误,因为在perldoc use的示例中省略了v

由于不支持v语法的Perl版本会在第一个use失败,因此它们将无法到达第二个更具体和可读性更强的语法。


3
当指定3个或更多部分时,v是可选的。 - ysth
@ysth: 当然,但是引言段讲述了使用v字符串,然后在示例中省略了v而没有提到它们是可选的。这是有效的代码,但它与引言不匹配。 - Adam Bellaire

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