Perl5.10和5.12的一些新特性,如"say",被定义为特性,您可以使用"特性"pragma显式启用或不允许这些特性。但其他添加,如正则表达式的命名捕获组,是隐式的。

当我使用5.10+解释器编写Perl,但希望它也在5.8上运行时,我可以让Perl抱怨使用任何不在5.8中的东西吗?显然,在你打算运行的所有主要版本上测试你的代码是一个很好的做法,但是让Perl自动警告我仍然很好。

有帮助吗?

解决方案

当我想确保一个程序将在特定版本的perl下运行时,我会在该版本的perl下测试它。我的一个特点 发行版 在实际上传之前,应用程序在多个perl下进行测试。

这需要您有一个适当的测试套件并编写足够的测试。在同一时间维护几个单独的perl安装也很容易,正如我在 有效的Perl编程.

测试::MinimumVersion 几乎听起来像它可能工作,但它有几个限制。它只看你给它的文件(所以它不会检查你加载的任何东西),我不认为它实际上看起来在正则表达式模式内部。每个报告最低版本是5.004,这对其中任何一个都不是真的:

#!perl

use Perl::MinimumVersion;

my $p_flag = <<'SOURCE';
'123' =~ m/[123]/p; # 5.10 feature
SOURCE

my $named_capture = <<'SOURCE';
'123' =~ m/(?<num>[123])/; # 5.10 feature
SOURCE

my $r_line_ending = <<'SOURCE';
'123' =~ m/[123]\R/p; # 5.12 feature
SOURCE

my $say = <<'SOURCE';
say 'Hello';
SOURCE

my $smart_match = <<'SOURCE';
$boolean = '123' ~~ @array;
SOURCE

my $given = <<'SOURCE';
given( $foo ) {
    when( /123/ ) { say 'Hello' }
    };

SOURCE

foreach my $source ( $p_flag, $named_capture, $r_line_ending, $say, $smart_match, $given ) {
    print "----Source---\n$source\n-----";
    my $version = Perl::MinimumVersion->new( \$source  )->minimum_version;
    print "Min version is $version\n";
    }

部分原因 Perl::MinimumVersion 工作是因为它寻找源已经给它的提示,例如 use 5.010, ,而 use feature 如此等等。但是,这不是启用功能的唯一方法。而且,正如你会注意到的,它错过了像 /p 标志,至少在有人添加支票之前。然而,你总是会用一个 PPI 解决方案。

只是编译它,运行测试,并找出更容易。

其他提示

我不认为您可以在运行代码时使Perl检查,但是 签出 perl :: minestversion test :: minestversion 。(后者只是一个 test :: builder 包装在前者周围。)

嗯,从阅读其他答案你的答案是否,但也许应用程序:: perlbrew 可以帮助您安装和管理多个版本的Perl进行测试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top