gpt4 book ai didi

perl - 我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?

转载 作者:行者123 更新时间:2023-12-04 10:21:47 25 4
gpt4 key购买 nike

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

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

最佳答案

当我想确保程序将在特定版本的 perl 下运行时,我会在该版本的 perl 下对其进行测试。我的 release 的一个功能在实际上传之前,应用程序在多个 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.010 , 和 use feature很快。但是,这并不是启用功能的唯一方法。而且,正如您会注意到的,它遗漏了诸如 /p 之类的东西。标志,至少在有人为此添加检查之前。然而,你总是会用 PPI 来追逐这样的事情。解决方案。

只需编译它、运行测试并找出结果就更容易了。

关于perl - 我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3301082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com