Какие модули Perl полезны для проверки аргументов подпрограммы?

Я ищу модуль общего назначения, чтобы вывести drudgery из проверки подпрограмм и аргументов метода. Я просмотрел различные возможности в CPAN: Params::Validate, Params::Smart, Getargs::Mixed, Getargs::Long и несколько других.

Была бы оценена любая информация о плюсах и минусах этих или других модулей. Спасибо.

Ответ 1

Если вы начнете использовать 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), и просто передайте объект.

Ответ 2

Посмотрите 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 для простых подпрограмм, но, к сожалению, он не так богат, как указано выше.

Ответ 3

В настоящее время я изучаю тот же вопрос, что и O.P.

Я заметил, что Дэйв Ролски - гиперпродуктивный программист славы Муза - недавно (2009) принял на себя обслуживание Params:: Validate, поэтому я считаю это хорошим знаком. Модуль не обновлялся с 2003 года. Поэтому, я думаю, он все еще может быть использован снова для проверки параметров подпрограммы.