假设我在CPAN上有一个模块,我想升级它以使用更新的Perls中的功能。现在,正如我所理解的那样,如果我这样做,我会在这个版本中加入一句话,如果你有Perl的X版本,你只能使用我的模块。
是否有一种干净/规范的方式来支持CPAN上同一模块的两个不同分支?
即,2.x系列将继续维持版本回到5.8.x,而3.x将用于版本5.16 +。
答案 0 :(得分:5)
{I}}变量已被弃用,而不是the $^V
variable,它将当前Perl解释器的版本保存为version
对象(如果版本较早,则保留$]
比v5.6)。
这允许将版本与version string constant进行比较,例如生成打包字符串的undef
(包含每个版本序号作为字符代码,因此v5.10
true < / em>的)。
由于v字符串是字符串,您必须将它们与字符串比较符v5.10 eq "\x05\x0A"
,lt
,le
,eq
和{{进行比较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
添加到混音中)。