Subscribed unsubscribe Subscribe Subscribe

Data::Validator のようにコマンドラインオプションをパースするやつを作った

perl

Getopt::TypeConstraint::Mouse - A command line options processor uses Mouse's type constraints - metacpan.org - Perl programming language

in your script

#!perl
use Getopt::TypeConstraint::Mouse;
 
my $options = Getopt::TypeConstraint::Mouse->get_options(
    foo => +{
        isa           => 'Str',
        required      => 1,
        documentation => 'Blah Blah Blah ...',
    },
    bar => +{
        isa           => 'Str',
        default       => 'Bar',
        documentation => 'Blah Blah Blah ...',
    },
);
 
print $options->{foo}, "\n";
print $options->{bar}, "\n";

使う

$ perl ./script.pl --for=Foo --bar=Bar
Foo
Bar

$ perl ./script.pl
Mandatory parameter 'foo' missing in call to (eval)

usage: script.pl [-?] [long options...]
	-? --usage --help  Prints this usage information.
	--foo              Blah Blah Blah ...
	--bar              Blah Blah Blah ...

コードは 99.9% MouseX::Getopt と同じです。

経緯

以下の条件を満たすコマンドラインオプションパーサーを探していた。

  1. Mouse の型を指定できる
  2. バリデーションにこけたら Usage を勝手に生成して出力してくれる
  3. PadWalker に依存しない(これさえ無ければ Smart::Options がドンピシャだった)

と、twitter で、つぶやいたら Songmu さんに MouseX::Getopt を教えていただいた。

MouseX::Getopt - A Mouse role for processing command line options - metacpan.org - Perl programming language

これは上の要件を満たしているのだけれど、コマンドラインオプションを解析するためにクラスを定義するのが個人的にはあまり直感的ではなく、 Data::Validator のようなインターフェイスで使いたかった。なので MouseX::Getopt の基底クラスを使ってインターフェイスだけ異なる Getopt::Constraint::Mouse というモジュールを作った。