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

Nei*_*hes 9 perl

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

use v5.12;

package MyPackage 0.01;
Run Code Online (Sandbox Code Playgroud)

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

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

amo*_*mon 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
    
    Run Code Online (Sandbox Code Playgroud)

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

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

一些修改是向后兼容的,因此不需要提供停用它们的方法(这就是featurepragma的用途).该use MODULE VERSION语法主要是向后兼容的.由于版本和导入列表之间缺少逗号

use MODULE VERSION LIST;
Run Code Online (Sandbox Code Playgroud)

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