7

Perl 5.10 和 5.12 的一些新特性,例如“say”,被定义为特性,您可以使用“feature”编译指示显式启用或禁止这些特性。但是其他添加,例如命名的正则表达式捕获组,是隐含的。

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

4

3 回答 3

9

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

这要求您拥有适当的测试套件并编写足够的测试。同时维护多个单独的 perl 安装也很容易,正如我在Effective Perl Programming中所展示的那样。

Test::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.010use feature等等。但是,这不是启用功能的唯一方法。而且,正如您将注意到的,它会遗漏诸如/p标志之类的东西,至少在有人为此添加检查之前是这样。但是,您将始终使用PPI解决方案来追求类似的东西。

编译它、运行测试并找出答案会更容易。

于 2010-07-21T16:44:48.140 回答
4

我认为您不能在运行代码时检查 Perl,但请查看Perl::MinimumVersionTest::MinimumVersion。(后者只是前者的Test::Builder包装器。)

于 2010-07-21T16:03:45.667 回答
1

从阅读其他答案来看,您的答案是否定的,但也许App::perlbrew可以帮助您安装和管理多个版本的 perl 进行测试。

于 2010-07-21T16:51:31.257 回答