Perl 按返回类型重载函数

Perl 按返回类型重载函数,perl,Perl,Perl就是这样一种语言,它支持按返回类型重载函数 这方面的一个简单例子是 CPAN中很少有nice模块可用,它扩展了wantarray()并为许多其他返回类型提供重载。这些模块是和。不幸的是,我不能使用这些模块,因为这两个模块在perl critic的perl版本5.8.9中都失败了(我不能升级这个perl版本) 因此,我正在考虑编写自己的模块,比如context::Return and Want,但只需很少的代码。我试图理解context::Return并想要模块代码,但我不是专家 我只需要

Perl就是这样一种语言,它支持按返回类型重载函数

这方面的一个简单例子是

CPAN中很少有nice模块可用,它扩展了wantarray()并为许多其他返回类型提供重载。这些模块是和。不幸的是,我不能使用这些模块,因为这两个模块在perl critic的perl版本5.8.9中都失败了(我不能升级这个perl版本)

因此,我正在考虑编写自己的模块,比如context::Return and Want,但只需很少的代码。我试图理解context::Return并想要模块代码,但我不是专家

我只需要对返回类型BOOL、OBJREF、LIST和SCALAR进行函数重载


请通过提供一些指导来帮助我,我如何开始。以
context::Return
Want
的方式使用Perl语法的模块肯定会与
Perl::Critic
相冲突。在这种情况下,主要的违规行为是偶尔禁用
strict
并使用子程序原型,这是最小的

我个人认为,坚持所有代码都必须通过任意一组测试,没有例外,这是一条愚蠢的规则,但我也认为,根据调用的上下文,任何行为非常不同的代码都可能设计糟糕,难以理解和维护。很少看到使用wantarray,因为Perl通常在不需要解释的情况下做正确的事情


我认为您可能遇到了一个使用起来很有趣的模块,并且希望以某种方式将其合并到代码中。您能通过展示一个需要您描述的全面上下文检查的子例程的示例来改变我的想法吗?

我不知道,CPAN说您的perl版本应该可以很好地用于context::Return…无论如何,提供一个额外的参数(context=>'BOOL')可能比构建一个额外的模块更简单如果Perl::Critic不喜欢它,为什么不添加一个规则,让它知道如何正确处理这些情况?这些规则由我们的客户机强制执行。cpan模块的策略是,如果被使用,也应该通过perl critic,严重性为5。我建议向Damian Conway发送电子邮件,询问他认为您应该做什么。我建议分叉context::Return,修复Perl::Critic冲突,并将更改提交给Damian,如果他对这些更改感兴趣的话。@zostay:编写这些模块提供的功能几乎不可能不违反Perl最佳实践的某些规定。特别是子例程在不使用原型的情况下不能接受代码块作为参数,因此规则会立即被打破。这些建议从来没有打算被如此严格地应用过。+1的愚蠢,加倍的代码,你甚至没有写<代码>Perl::Critic不是代码质量的全部;作为一个被广泛使用的Perl模块应该已经足够了。@Dashwuff:但问题一如既往,很可能是说服管理层,因为他们知道自己已经强制执行了任何类型的标准,并且在必要时可以为自己辩护。一个有力的反驳可能是,许多重要的Perl核心模块也会出现错误。(例如,
CGI.pm
有八次失败,
Moose.pm
有一次失败。但是没有人会理智地认为你应该使用自己的CGI模块,或者避开Moose。)即使是
strict.pm
warnings.pm
也不能通过测试!