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

时间:2015-04-27 14:54:27

标签: perl cpan

假设我在CPAN上有一个模块,我想升级它以使用更新的Perls中的功能。现在,正如我所理解的那样,如果我这样做,我会在这个版本中加入一句话,如果你有Perl的X版本,你只能使用我的模块。

是否有一种干净/规范的方式来支持CPAN上同一模块的两个不同分支?

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

2 个答案:

答案 0 :(得分:5)

{I}}变量已被弃用,而不是the $^V variable,它将当前Perl解释器的版本保存为version对象(如果版本较早,则保留$]比v5.6)。

这允许将版本与version string constant进行比较,例如生成打包字符串的undef(包含每个版本序号作为字符代码,因此v5.10 true < / em>的)。

由于v字符串是字符串,您必须将它们与字符串比较符v5.10 eq "\x05\x0A"ltleeq和{{进行比较1}},所以你会写类似

的东西
ge

但我想知道你的代码如何在不同版本的Perl之间进行更新?大多数变化都是语法变化,只是提供了编写某些结构的更好方法。通常只需要为您想要支持的最早版本编写代码。曾经是v5.8,但v5.10是一个重大修订版,许多人认为它已经是七年之久的最低要求版本了。

答案 1 :(得分:4)

具有两个具有相同名称的分支的问题是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添加到混音中)。