我是否应该能够使用新的5.12包版本语法而无需指定所需的Perl版本?

时间:2013-05-22 12:57:38

标签: perl

我对Perl 5.12中引入的use VERSION语法和package NAME VERSION语法的需求感到困惑。我希望必须同时指定:

use v5.12;

package MyPackage 0.01;

我见过的任何例子都是这样的。然而,偶然(即复制和粘贴而没有注意)我发现这个新的包版本语法在我use 5.010甚至没有指定版本时起作用。

底层的Perl安装是ActiveState 5.14,所以在这种情况下解释器版本是唯一的要求吗?我的印象是新功能始终需要use VERSION语法,以帮助向后兼容。有例外吗?

2 个答案:

答案 0 :(得分:11)

并非每项新功能都是feature

use VERSION语法执行此操作:

  • 当前perl版本太低时抛出错误。
  • feature pragma导入适当的功能集。我的feature版本的perldoc页面列出了:

    bundle    features included
    --------- -----------------
    :default  array_base
    
    :5.10     say state switch array_base
    
    :5.12     say state switch unicode_strings array_base
    
    :5.14     say state switch unicode_strings array_base
    
    :5.16     say state switch unicode_strings
               unicode_eval evalbytes current_sub fc
    

    (实际上,array_base是在5.16中引入的,但是被添加到以前的for-compat包中。)

  • 自5.11.0起,strict编译指示在当前范围内被激活。

某些修改是向后兼容的,因此无需提供停用它们的方法(这就是feature编译指示的含义)。 use MODULE VERSION语法在很大程度上是向后兼容的。由于

中版本和导入列表之间缺少逗号
use MODULE VERSION LIST;

这不是问题(即此语法以前是非法的)。如果缺少LISTimport方法将在perls上收到无法识别此语法的版本号。 Exporter模块处理这种情况,并检查模块版本。因此,通过导出器(大多数)提供import的所有模块都是安全的。

答案 1 :(得分:4)

use VERSION为您提供了可以使用use feature明确启用的所有内容,如果当前版本低于您想要的版本,则会抱怨。请参阅此文档:http://perldoc.perl.org/functions/use.html

  

如果VERSION大于版本,则引发异常   现任Perl翻译; Perl不会尝试解析其余部分   文件。

     

[..]

     

use VERSION还会启用所请求的所有功能   由feature pragma定义的版本,禁用任何功能   在请求的版本的功能包中。看功能。同样,如果   指定的Perl版本大于或等于5.11.0,   与使用严格一样,在词汇上启用限制。任何明确的用途   use strictno strict会覆盖use VERSION,即使它来了   在它之前。在这两种情况下,feature.pm和strict.pm文件都不是   实际装了。

只是改变的东西,如某些函数的行为,正则表达式修饰符和perldelta中描述的其他内容与此无关。你不能强迫它回到以前版本的行为,因为那不在你的perl解释器中。


我在生产中出现此问题的一个例子是正则表达式的/r修饰符。这是在Perl 5.14.0中引入的。如果在5.12上使用它,则会出现语法错误。一旦它在5.14上运行它就会工作,即使是这样的程序:

#!/usr/bin/perl
use strict; use warnings;
my $foo = 'foobar';
print $foo =~ s/foo/oof/r;