Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写CPAN模块以支持多个Perl版本?_Perl_Cpan - Fatal编程技术网

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

如何编写CPAN模块以支持多个Perl版本?,perl,cpan,Perl,Cpan,假设我在CPAN上有一个模块,我想升级它以使用较新的PERL的功能。现在,据我所知,如果我这样做了,我会在沙地上放一行字,说从这个版本开始,只有当你有Perl的X版本时,你才能使用我的模块 是否有一种干净/规范的方法来支持CPAN上同一模块的两个不同分支 i、 例如,2.x系列将继续为5.8.x版本维护,而3.x将为5.16+版本维护。拥有两个同名分支的问题是,cpan::Module对于某些用户来说将不必要地失败(因为它总是获得最新版本)。他们仍然可以安装较旧版本的模块,但这将更加麻烦。相反,

假设我在CPAN上有一个模块,我想升级它以使用较新的PERL的功能。现在,据我所知,如果我这样做了,我会在沙地上放一行字,说从这个版本开始,只有当你有Perl的X版本时,你才能使用我的模块

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


i、 例如,2.x系列将继续为5.8.x版本维护,而3.x将为5.16+版本维护。

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

package The::Module;
do($] < 5.016 ? 'The/Module/Pre5016.pm' : 'The/Module/5016.pm')
   or die $@ || $!;
1;
封装::模块;
do($]<5.016?'The/Module/Pre5016.pm':'The/Module/5016.pm')
或者死$@| |$!;
1.
如果模块中只有有限的部分是不同的,您可以简单地使用

sub _foo_compatible { ... }

sub _foo_fast { ... }

*foo = $] < 5.016 ? \&_foo_compatible : \&_foo_fast;
sub\u foo\u兼容{…}
sub_foo_fast{…}
*foo=$]<5.016\&_foo_兼容:\&foo_fast;

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

已弃用
$]
变量,而将当前Perl解释器的版本作为对象保存(或
unde
如果版本早于v5.6)

这允许将版本与产生压缩字符串的类似
v5.10
进行比较(将每个版本序号作为字符代码包含,因此
v5.10 eq“\x05\x0A”
为真)

因为v字串是字串,所以您必须将它们与字串比较器
lt
le
eq
ge
gt
进行比较,所以您可以编写如下代码

use v5.6;

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

但我想知道您的代码在不同版本的Perl之间会如何变化?大多数的变化是句法上的变化,只是提供了一种更好的方式来编写某些结构。通常只需要为您想要支持的最早版本编写。以前是v5.8,但v5.10是一个主要的修订版,许多人认为它是一个最低要求的版本,现在已经超过七年了。

这仍然是模块的一个版本,它只是根据版本做不同的事情;我想知道的是,我是否可以将模块v2.x发布到CPAN,并让Perl5.8.9使用它,而发布模块v3.x则由任何更新的模块使用。诀窍是,我怎样才能让CPAN/cpanm/随便什么来保持模块版本的区别,而不是让我的模块处理所有这些?虽然这可能有效,但鼓吹使用不推荐使用的变量是错误的<代码>$^V自从perlvar v5.14.0Let-us以来,Perl 5.6中就一直被记录为不推荐使用。@Borodin,这是一个文档错误<代码> $[] /代码>从不被弃用,并被标记为弃权。难道<代码>不要求<代码>删除对<代码>或死亡的需要吗?< /代码>杂波?我认为我不够清楚。我正试图让CPAN考虑支持同一模块的多个版本,就像Perl5.18.4和5.20.2一样,现在都被认为是Perl5的受支持版本。这样,我就可以从活动代码库中删除所有5.8ISM,同时在不太活跃的代码库中仍然支持5.8(而不更改模块名称),您需要更好地解释一下。
cpan
实用程序将只安装任何模块的最新版本。如果您想要一个更早的版本,那么您必须手动下载、构建、测试和安装它。您可以编写一个包装器模块,根据解释器版本加载不同的工作模块,但它们必须有不同的名称。我认为cpxxxan解决了我感兴趣的问题,尽管我不知道是否有办法使其更基于契约。在谷歌工作的时候,我有点紧张…@ikegami:是的。它是不推荐和删除的变量列表中的最后一个变量,即“因为v字符串是字符串,所以必须将它们与字符串比较器进行比较”,而不是这样。事实上,版本对象文档中的所有示例都使用数值比较运算符。字符串比较运算符也可以工作,但绝对不需要使用它们。(“版本对象重载
cmp
运算符。Perl会根据这两个运算符自动生成所有其他比较运算符,以便所有正常的逻辑比较都能正常工作。”)
$]
实际上并没有被弃用。这是一个文档错误,此后一直存在。