我正在寻找一个通用模块,以便在验证子例程和方法参数时不再使用苦差事。我已经通过CPAN扫描了各种可能性:Params::Validate
,Params::Smart
,Getargs::Mixed
,Getargs::Long
以及其他几种。
有关这些或其他模块的利弊的任何信息将不胜感激。感谢。
答案 0 :(得分:6)
如果您开始使用Moose
,则会根据自己的喜好找到MooseX::Types
。类型自动具有is_ $ type()和to_ $ type()。这些用于确保输入传递类型约束,或使输入对类型具有有效的强制。即使对于这些类型的东西,我也更喜欢它们,因为你可以确保对象的状态具有所述类型,而无需额外费用。
use Moose;
has 'foo' => ( isa => MyType, is => ro );
sub _check_my_type {
my ( $self, $type ) = @_;
is_MyType( $type );
};
它可能缺乏对深度/递归类型的一些支持,但如果你在现代perl中使用这些东西,你可能“做错了”。而是使用具有自己的一致性检查的对象(如上面的MyType一样),然后传递对象。
答案 1 :(得分:5)
查看MooseX::Method::Signatures,它提供的不仅仅是验证参数。
来自POD的例子:
package Foo;
use Moose;
use MooseX::Method::Signatures;
method morning (Str $name) {
$self->say("Good morning ${name}!");
}
method hello (Str :$who, Int :$age where { $_ > 0 }) {
$self->say("Hello ${who}, I am ${age} years old!");
}
method greet (Str $name, Bool :$excited = 0) {
if ($excited) {
$self->say("GREETINGS ${name}!");
}
else {
$self->say("Hi ${name}!");
}
}
MooseX::Method::Signatures也是MooseX::Declare的标准配置,它为Perl版带来了更加性感的语法。上面的内容可以这样编写(仅显示第一种简洁方法):
use MooseX::Declare;
class Foo {
method morning (Str $name) {
$self->say("Good morning ${name}!");
}
}
对于普通子程序,还有一个推论signatures CPAN模块,但不幸的是它没有上面那么丰富的功能。
答案 2 :(得分:2)
我目前正在研究与O.P.
相同的问题我注意到Dave Rolsky-- Moose成名的高效程序员 - 最近(2009年)接管了Params :: Validate的维护,所以我认为这是一个好兆头。该模块自2003年以来一直没有升级。所以我想,它仍然可以再次用于检查子程序参数。