如何编写 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
, ge
和 gt
,所以你会写类似
use v5.6;
if ( $^V ge v5.10 ) { ... }
但我想知道您的代码如何在不同版本的 Perl 之间转换?大多数更改是语法更改,只是提供了一种更好的编写某些结构的方法。通常只需要为您想要支持的最早版本编写。它曾经是 v5.8,但 v5.10 是一个主要修订版,许多人认为它是最低要求的版本,因为它已经有七年多的历史了。
假设我在 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
, ge
和 gt
,所以你会写类似
use v5.6;
if ( $^V ge v5.10 ) { ... }
但我想知道您的代码如何在不同版本的 Perl 之间转换?大多数更改是语法更改,只是提供了一种更好的编写某些结构的方法。通常只需要为您想要支持的最早版本编写。它曾经是 v5.8,但 v5.10 是一个主要修订版,许多人认为它是最低要求的版本,因为它已经有七年多的历史了。