Perl 5.10和5.12的一些新功能,例如“说”,被定义为功能,您可以启用或禁止显式使用“功能”编译指示。但其他附加内容,如正则表达式的命名捕获组,是隐含的。
当我使用5.10+解释器编写Perl但希望它也能在5.8上运行时,我能否让Perl抱怨使用5.8中没有的东西?显然,最好在你打算运行的所有主要版本上测试你的代码,但让Perl自动警告我仍然很好。
答案 0 :(得分:9)
当我想确保程序在特定版本的perl下运行时,我会在该版本的perl下测试它。我的release应用程序的一个功能是在实际上传之前在多个perls下进行测试。
这要求您拥有适当的测试套件并编写足够的测试。正如我在 Effective Perl Programming 中所展示的那样,同时维护几个单独的perl安装也很容易。
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.010
和use feature
等。但是,这不是启用功能的唯一方法。并且,正如您将注意到的,它错过了/p
标记之类的内容,至少在有人为此添加检查之前。但是,你总是会用PPI解决方案追逐类似的事情。
编译它,运行测试并找出它更容易。
答案 1 :(得分:4)
我不认为您可以在运行代码时进行Perl检查,但是 查看Perl::MinimumVersion和Test::MinimumVersion。 (后者只是围绕前者的Test::Builder包装。)
答案 2 :(得分:1)
通过阅读其他答案,你的答案是否定的,但也许App::perlbrew可以帮助你安装和管理多个版本的perl进行测试。