Perl 5.10 和 5.12 的一些新功能(例如“say”)被定义为功能,您可以使用“feature”编译指示显式启用或禁止这些功能。但其他添加,例如正则表达式的命名捕获组,是隐式的。
当我使用 5.10+ 解释器编写 Perl,但希望它也能在 5.8 上运行时,我可以让 Perl 抱怨使用 5.8 之外的任何内容吗?显然,在您打算运行的所有主要版本上测试您的代码是一个很好的做法,但是让 Perl 自动警告我仍然很好。
当我想确保程序可以在特定版本的 perl 下运行时,我会在该版本的 perl 下测试它。我的一个特点release http://search.cpan.org/dist/Module-Release应用程序在实际上传之前会在多个 perls 下进行测试。
这要求您拥有适当的测试套件并编写足够的测试。同时维护多个单独的 Perl 安装也很容易,正如我在有效的 Perl 编程中所示。
测试::最低版本 http://search.cpan.org/dist/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::最低版本 http://search.cpan.org/dist/Perl-MinimumVersion有效是因为它寻找源已经给出的提示,例如use 5.010
, and use feature
很快。但是,这并不是启用功能的唯一方法。而且,正如您会注意到的,它错过了诸如/p
标志,至少在有人为此添加检查之前。然而,你总是会用一种PPI http://search.cpan.org/dist/PPI解决方案。
编译它、运行测试并找出答案会更容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)