ふたこもり

2008-09-04

GetOpt::Longでコマンドラインオプションを処理する

| 19:52

引数を取らないオプション

use Getopt::Long;

my $flag = 0;
my $count = 0;

GetOptions(
    "flag"   => \$flag, # --flagで$flagを1にする
    "flag!"  => \$flag, # --noflagで$flagを0にする(反転オプション)
    "count+" => \$count # --countの数だけ$countを増やす(増分オプション)
);

print "flag  => $flag\n";
print "count => $count\n";
$ perl test.pl --flag
flag  => 1
count => 0
$ perl test.pl --flag --noflag
flag  => 0
count => 0
$ perl test.pl --count --count --count
flag  => 0
count => 3

引数を取るオプション

use Getopt::Long;

my $str = "";
my $num = 0;

GetOptions(
    "str=s" => \$str, # 文字列を引数に取る
    "num=i" => \$num  # 数値を引数に取る
);

print "str => $str\n";
print "num => $num\n";
$ perl test.pl --str hoge --num=5
str => hoge
num => 5
$ perl test.pl --num hoge
Value "hoge" invalid for option num (number expected)
str => 
num => 0

引数配列に格納する

use Getopt::Long;

my @nums = ();

GetOptions(
    "num=i" => \@nums   # 引数を配列に格納する
);

print "nums => @nums\n";
$ perl test.pl --num 1 --num=5
nums => 1 5

--num 1 2 3 というようにまとめて引数を渡すこともできる。

use Getopt::Long;

my (@arr1, @arr2, @arr3);

GetOptions(
    "arr1=i{3}"   => \@arr1, # 引数の数は3つまで
    "arr2=i{,}"   => \@arr2, # 引数の数は1つ以上
    "arr3=i{2,4}" => \@arr3  # 引数の数は2〜4(足りない場合は警告)
);

print "arr1 => @arr1\n";
print "arr2 => @arr2\n";
Insufficient arguments for option arr3
arr1 => 1 2 3
arr2 => 1 2 3 4 5
arr3 => 1

オプションハッシュに格納する

use Getopt::Long;

my %opts = ();

GetOptions(
    \%opts,
    "flag",
    "str=s",
    "num=i@" # 配列のリファレンスに引数を格納する
);

print "flag => $opts{flag}\n";
print "str  => $opts{str}\n";
print "num  => @{$opts{num}}\n";
$ perl test.pl --flag --str=hoge --num 3 -num 8
flag => 1
str  => hoge
num  => 3 8

この場合は、--num 3 8 という渡し方はできないらしい。


短いオプション

短いオプション名(-f)は長いオプション名(--flag)から自動的に作られる。頭文字が同じオプションが複数ある場合は、特定されるまで文字を入力する。

use Getopt::Long;

my %opts = ();

GetOptions(
    \%opts,
    "flag",
    "flag!",
    "min=i",
    "max=i"
);

while (my ($k, $v) = each %opts) {
    print "$k => $v\n";
}
$ perl test.pl -f
flag => 1
$ perl test.pl -f -nof
flag => 0
$ perl test.pl -m 5
Option m is ambiguous (max, min)
$ perl test.pl -mi 3 -ma 9
min => 3
max => 9

コマンドラインオプションと他の引数の混在

コマンドラインオプションとして処理されなかった引数は@ARGVに残る。また、--を引数に渡すと、それ以降の引数オプションとして扱われない。

use Getopt::Long;

my %opts = ();

GetOptions(\%opts, "flag");

print "flag => $opts{flag}\n";
print "ARGV => @ARGV\n";
$ perl test.pl -f hoge
flag => 1
ARGV => hoge
$ perl test.pl -f -- -f   
flag => 1
ARGV => -f
Connection: close