9

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

use v5.12;

package MyPackage 0.01;

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

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

4

2 回答 2

11

并非每个新功能都是feature.

use VERSION语法这样做:

  • 当前 perl 版本太低时抛出错误。
  • featurepragma 中导入适当的功能集。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 中引入,但被添加到以前的包中以进行反向兼容)。

  • 从 5.11.0 开始,strictpragma 在当前范围内被激活。

一些修改是如此向后兼容,以至于不需要提供一种方法来禁用它们(这就是featurepragma 的含义)。语法在use MODULE VERSION很大程度上是向后兼容的。由于版本和导入列表之间缺少逗号

use MODULE VERSION LIST;

这不是问题(即这种语法以前是非法的)。当LIST缺少 时,该import方法将在不识别此语法的 perls 上接收版本号。模块处理这种Exporter情况,并检查模块版本。所以所有提供importvia Exporter 的模块(大部分)都是安全的。

于 2013-05-22T13:36:44.343 回答
4

use VERSION为您提供了您可以明确打开的所有内容,use feature并在您当前的版本低于您想要的版本时抱怨。请参阅此文档: http: //perldoc.perl.org/functions/use.html

如果 VERSION 大于当前 Perl 解释器的版本,则会引发异常;Perl 不会尝试解析文件的其余部分。

[..]

use VERSION还启用由 pragma 定义的请求版本中可用的所有功能feature,禁用不在请求版本的功能包中的任何功能。见功能。类似地,如果指定的 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;
于 2013-05-22T13:32:30.910 回答