我对Perl 5.12中引入的use VERSION
语法和package NAME VERSION
语法的需求感到困惑。我希望必须同时指定:
use v5.12;
package MyPackage 0.01;
我见过的任何例子都是这样的。然而,偶然(即复制和粘贴而没有注意)我发现这个新的包版本语法在我use 5.010
甚至没有指定版本时起作用。
底层的Perl安装是ActiveState 5.14,所以在这种情况下解释器版本是唯一的要求吗?我的印象是新功能始终需要use VERSION
语法,以帮助向后兼容。有例外吗?
答案 0 :(得分:11)
并非每项新功能都是feature
。
use VERSION
语法执行此操作:
从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;
这不是问题(即此语法以前是非法的)。如果缺少LIST
,import
方法将在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 strict
或no 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;