如何编写 CPAN 模块以支持多个 Perl 版本?

How can I write a CPAN module to support multiple Perl versions?

假设我在 CPAN 上有一个模块,我想升级它以使用来自较新 Perls 的功能。现在,据我所知,如果我这样做,我就在沙子上写了一条线,说从这个版本开始,如果你有 Perl 的 X 版本,你只能使用我的模块。

是否有 clean/canonical 方法来支持 CPAN 上同一模块的两个不同分支?

即,2.x 系列将继续维护版本回到 5。8.x,而 3.x 将用于版本 5.16+。

有两个同名分支的问题是 cpan The::Module 对某些用户来说会不必要地失败(因为它总是会获得最新版本)。他们仍然可以安装旧版本的模块,但会麻烦得多。相反,将模块更改为

package The::Module;
do($] < 5.016 ? 'The/Module/Pre5016.pm' : 'The/Module/5016.pm')
   or die $@ || $!;
1;

如果模块只有有限的部分不同,您可以简单地使用

sub _foo_compatible { ... }

sub _foo_fast { ... }

*foo = $] < 5.016 ? \&_foo_compatible : \&_foo_fast;

第二种方法的缺点是需要在 5.8 中编译两个子程序(除非您将 eval EXPR 添加到组合中)。

$] 变量已被弃用,取而代之的是 the $^V variable which holds the version of the current Perl interpreter as a version 对象(如果版本早于 v5.6,则 undef)。

这允许将版本与 version string constant 进行比较,例如 v5.10 生成打包字符串(包含每个版本序号作为字符代码,因此 v5.10 eq "\x05\x0A").

因为 v-strings 是 strings 你必须将它们与字符串比较器 lt, le, eq, gegt,所以你会写类似

use v5.6;

if ( $^V ge v5.10 ) { ... }

但我想知道您的代码如何在不同版本的 Perl 之间转换?大多数更改是语法更改,只是提供了一种更好的编写某些结构的方法。通常只需要为您想要支持的最早版本编写。它曾经是 v5.8,但 v5.10 是一个主要修订版,许多人认为它是最低要求的版本,因为它已经有七年多的历史了。