Getopt::LongモジュールのGetOptions関数を使うと、GNUのgetopt_long関数のようなコマンドライン引数の処理を行うことができます。getopt_long関数ではオプション名の大文字小文字は区別されません。このgetopt_long関数を使うにはGetopt::Longモジュールをロードする必要があります。
GNU系のCUIアプリを使うと、オプションには--helpのような"長いオプション"と-hのような"短いオプション"が同じ機能に割り当てられることがあります。getopt_long関数もこのような"長いオプション"と"短いオプション"を扱うことができます。"長いオプション"は、--helpのように名前の先頭に"--"が付きます。"短いオプション"は-hのように名前の先頭に"-"が付きます。
GetOptionsの最も単純な使い方は引数を持たないオプションを定義することです。
GetOptions ( 'option_name' => \variable [, 'option_name' => \variable, ... ] );
option_nameには「長いオプション」の名前を指定します。たとえば--helpオプションを使うには「help」を指定します(「--」は省きます)。variableにはオプションの評価の結果を格納する変数を指定します。オプションが見つかったときに、この変数にtrueがセットされます。オプションが見つからない場合はこの変数は変化しませんのでGetOptionsを実行する前にfalseに初期化する必要があります。
以下のスクリプトは--helpと--copyオプションを調べます。## オプションの値(デフォルトでfalse) my $help = ''; my $copy = ''; use Getopt::Long; GetOptions ( 'help' => \$help, 'copy' => \$copy ); if ( $help ) { print "help\n"; } if ( $copy ) { print "copy\n"; }
ここでは"短いオプション"は定義しませんが、"短いオプション"の名前は"長いオプション"名前の先頭の文字から作られます。この例では-hは--helpと等価で、-cは--copyと等価です。
if ( !-d $OUTDIR ) { mkdir $OUTDIR; }
オプションは引数を持つこともできます。
GetOptions ( 'option_name[ =type ]' => \variable [, 'option_name [ = type ]' => \variable, ... ] );
option_name名の後、=に続けてオプションの引数の型を指定します。=sを付けると文字列、=iを付けると整数、=fを付けると浮動小数点数として引数が解釈されます。受け取った引数はvariableに格納されます。
use Getopt::Long; my $color = 'green'; GetOptions ( 'color=s' => \$color ); print "help=" . $color . "\n";
上記のスクリプトで、コマンドラインにオプションを指定しなければ$colorのデフォルト値(green)が表示されます。
オプションの数が増えると、上記の方法ではオプションの定義が煩雑化します。 オプションの引数を連想配列にとる方法を使うことで、オプションの定義を簡素化することができます。この方法はこれまでの使い方と書式が少し異なります。
GetOptions ( \%variable, 'option_name[=type]' [, 'option_name[=type]', ... ] );
variableにはオプションの引数を受け取る連想配列を指定します。 引数はすべてこの連想配列に入りますので、個々のオプションに対応する変数は指定しません。以下は連想配列にオプションの引数を取る例です。
my %options =(); use Getopt::Long; GetOptions ( \%options, 'help', 'color=s' ); if ( $options{ help } ) { print "help\n"; } if ( $options{ color } ) { print "color = " . $options{ color }; }