我对Perl5.12中引入的use VERSION语法和package NAME VERSION语法的必要性感到困惑。我本以为必须同时指定两个:
use v5.12;
package MyPackage 0.01;我见过的任何例子都是这样的。然而,偶然(即不加注意地复制和粘贴),我发现当我有use 5.010或者甚至没有指定版本时,这个新的包版本语法可以工作。
底层的Perl安装是ActiveState 5.14,那么在这种情况下解释器版本是唯一的要求吗?我的印象是,新特性总是需要use VERSION语法,以帮助向后兼容。有例外吗?
发布于 2013-05-22 21:36:44
并不是每个新特性都是feature。
use VERSION语法执行以下操作:
当当前的perl版本太低时,
feature杂注中导入适当的功能集。我的feature版本的perldoc页面列出:包含的捆绑功能-:默认array_base :5.10表示状态开关array_base :5.12表示状态开关unicode_strings array_base :5.14表示状态开关unicode_strings array_base :5.16表示状态开关unicode_strings unicode_eval unicode_strings current_sub fc
(实际上,array_base是在5.16中引入的,但被添加到以前的back-compat).
strict杂注在当前范围内激活。有些修改是如此向后兼容,以至于不需要提供一种方法来停用它们(这就是feature杂注的意义)。use MODULE VERSION语法在很大程度上是向后兼容的。中的版本和导入列表之间缺少逗号。
use MODULE VERSION LIST;这不是问题(即这种语法以前是非法的)。当LIST丢失时,import方法将接收不能识别此语法的perls上的版本号。Exporter模块处理这种情况,并检查模块版本。因此,通过Exporter提供import的所有模块(大多数)都是安全的。
发布于 2013-05-22 21:32:31
use VERSION为你提供了所有你可以用use feature显式打开的东西,如果你当前的版本低于你想要的版本,你会抱怨。请参阅此文档:http://perldoc.perl.org/functions/use.html
如果版本高于当前Perl解释器的版本,则会引发异常;Perl将不会尝试解析文件的其余部分。
。。
use VERSION还启用了由feature杂注定义的请求版本中的所有可用功能,禁用了请求版本的功能包中未包含的所有功能。请参见功能。类似地,如果指定的Perl版本大于或等于5.11.0,就会像use strict一样在词法上启用strictures。任何对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;https://stackoverflow.com/questions/16692410
复制相似问题