Getopt::Longで、定義していない引数を捕捉する方法
最近PerlPerl言い出してますが、お仕事でPerlのコマンドラインツールを作ってるんですよ。
それで、引数を扱うときにGetopt::Longという便利なモジュールがあるのですが、こいつで定義していないオプションが指定された場合を上手く捕捉する方法を探すのにちょっと苦労したので、覚書しておきます。
このGetopt::Long、便利なやつで、
use Getopt::Long; my $arg_1; GetOptions( 'first' => \$arg_1 );
とするだけでコマンドラインで「--first」「-f」(firstの頭文字ね)を指定されたときに$arg_1変数に1を格納してくれます。
あとはif( $arg_1 ) なんちゃら;で振る舞いを分けられる。
オプションに対して値を受け取りたいときも簡単で、こうするだけ
use Getopt::Long; my $arg_1; GetOptions( 'first=s' => \$arg_1 );
こうすると、「-f honyarara」と指定されたときに、$arg_1にhonyararaが入ります。
'first=s'の=sを=iにすれば整数値、=fにすれば浮動小数点として評価してくれるとのこと。
で、これを使わせてもらってほいほい組んでいたのですが、テスト時に
コマンド -f pogege
とするところを、
コマンド pogege
と打っちゃったんですよ。
当然なんですが、そのまま走りやがんの。
「-」が付いていないにしても、間違ったオプションを指定されたら止まってほしいナァと思って調べているとGetopt::LongのPOD(って言うんでしたっけ?)に、
A special option 'name' <> can be used to designate a subroutine
to handle non-option arguments. When GetOptions() encounters an
argument that does not look like an option, it will immediately call this
subroutine and passes it the argument as a parameter.For example:
my $width = 80;
sub process { ... }
GetOptions ('width=i' => \$width, '<>' => \&process);When applied to the following command line:
という記述がありました。
「<>」を引数定義として使用したときに、=>の先に関数リファレンスを指定することで、定義していない引数があったときの処理を指定することができる、ということっぽいなぁ・・・つまりこういうこと?
use Getopt::Long; my $arg_1; GetOptions( 'first=s' => \${arg_1}, '<>' => \&unknownArgHandler ); sub unknownArgHandler{ print STDERR "undefined Option! @_\n"; exit; }
いけました。
これで、test.pl matigaeta
とかやったときに異常終了させることができます、と。
以上備忘録でした。