什么Perl模块可用于验证子例程参数?

时间:2009-09-16 13:46:35

标签: perl validation parameters

我正在寻找一个通用模块,以便在验证子例程和方法参数时不再使用苦差事。我已经通过CPAN扫描了各种可能性:Params::ValidateParams::SmartGetargs::MixedGetargs::Long以及其他几种。

有关这些或其他模块的利弊的任何信息将不胜感激。感谢。

3 个答案:

答案 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年以来一直没有升级。所以我想,它仍然可以再次用于检查子程序参数。