我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?
Posted
技术标签:
【中文标题】我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?【英文标题】:Can I make sure Perl code written on 5.10+ will run on 5.8? 【发布时间】:2011-03-19 01:58:46 【问题描述】:Perl 5.10 和 5.12 的一些新特性,例如“say”,被定义为特性,您可以使用“feature”编译指示显式启用或禁止这些特性。但其他添加,例如命名的正则表达式捕获组,是隐含的。
当我使用 5.10+ 的解释器编写 Perl,但希望它也能在 5.8 上运行时,我可以让 Perl 抱怨使用 5.8 中没有的任何东西吗?显然,最好在您打算运行的所有主要版本上测试您的代码,但让 Perl 自动警告我仍然很好。
【问题讨论】:
另见:***.com/questions/2500892/… 【参考方案1】:当我想确保某个程序可以在特定版本的 perl 下运行时,我会在该版本的 perl 下对其进行测试。我的release 应用程序的一项功能在实际上传之前在多个 perls 下进行测试。
这要求您拥有合适的测试套件并编写足够的测试。同时维护多个单独的 perl 安装也很容易,正如我在有效的 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 解决方案来追求类似的东西。
只需编译、运行测试并找出答案就更容易了。
【讨论】:
感谢您提供令人惊讶的深入回答(像往常一样)。我们的问题是,像往常一样,大量没有测试的旧代码。尽管如此,我看到你的答案是正确的,被接受了。 "say" 可以由 Perl6::Say 9 添加(我自己在 5.8.8 上使用它) - 所以我不打算在 Perl::MinimumVersion 中添加检查。正则表达式太难添加,但应该添加“给定”和“何时”。 我应该注意到问题不在于 Perl::MinimumVersion,而在于 Perl 中的静态分析思想。 PPI 很棒,但我们理解它解析的内容的能力从根本上是有问题的,因为 Perl 是特殊的。 :)【参考方案2】:我不认为你可以在运行代码时让 Perl 检查,但是 查看Perl::MinimumVersion 和Test::MinimumVersion。 (后者只是前者的 Test::Builder 包装器。)
【讨论】:
你有什么可以用的吗?我认为这不会有帮助。 好吧,我自己从未尝试过,但这是它试图解决的问题。它解决得如何是另一个问题。【参考方案3】:阅读其他答案后,您的答案是否定的,但也许 App::perlbrew 可以帮助您安装和管理多个版本的 perl 进行测试。
【讨论】:
以上是关于我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?的主要内容,如果未能解决你的问题,请参考以下文章