yukke::note

technical note

perlのGetopt::Longを使った感想

 perlのデフォルトのモジュールには、Getopt::Longが入っており、コマンドラインの引数処理を楽に書くことができるようになっている。
これまでは、自前でオプション名や引数の型チェックなどを書いていたが、いい加減べんりで楽な方法を使ってみることにした。

基本

 ベーシックな使い方は、

#!/usr/bin/env perl

use strict;
use warnings;
use Getopt::Long;

GetOptions ('help|man' => \$HELP,
             'in=s'     => \$INFILE);

のようにオプションを渡していく。

  • perl $0 -in file.txtのような使い方になる。
  • help => \$HELPだと、引数を要求せず単独で動く。
  • |を使うことで、複数の名前を使える。e.g. helpとh、versionとverなど。
  • オプションと値をハッシュにしたり、予め変数宣言のときにデフォルト値をセットしておくこともできる。
  • option名=s(strings)で値に文字列以外が与えられた場合は、エラーを出力する(※プログラム自体はそのまま実行されるので注意)。=iはinteger、=fはfloatになる。このとき、=sで[0-9]をセットしても、文字列として数字が評価されるのでエラーにはならないことに注意。

 これで、楽に引数やセットされる値はチェックできるが、--helpや--manをしたときは、ヘルプを表示してプログラムを終了させることや、実行に必須な引数が不足した場合にはdie()することなどは出来ない。
 そこで以下のようにして書いてみる。

変なオプションが渡されたときは死のう

use Getopt::Long;

## Default value:
my $HELP = undef;

GetOptions ('help' => \$HELP) || die "Invalid options";
  • これで、変なオプションが入った時には、dieするようになる。

--helpした時だけ、ダイイングメッセージ

my $HELP = undef;

GetOptions ('help' => \$HELP);

if ($help) {
    die "Usage: { something... }"
}
  • デフォルトでは未定義なので、--helpされるとdie()する。

オプションの数が足りないときは死にたい

use Getopt::Long;

if (scalar @ARGV<1) {
    die show_help();
}

sub show_help {
    my $help_doc = <<EOF;
this is test program

Usage:
       perl $0 [options]

Options:
         --infile
         --help
EOF
    return $help_doc;
}
  • Getopt::Longは面倒を見てくれない(たぶん)なので、普通に条件を書く。
  • インプットファイルがないときは死にたいなども、デフォルトをmy $infile = undef;としておいて、後でセットされているかをif文でチェックすれば良い。

感想

  • やっぱり便利だった。もっと早くから使うべきだった。
  • なんかいっぱい死にたいって書いた気がするけど、別に死にたいくないです。
  • 最近、らーめん食べてない気がする。

おしまい。