2012年2月11日土曜日

perl でオプション解析(Getopt::Long編)

前に、Getopt::Std編getoptコマンド編 を書きましたが、同じオプションを複数回指定するパターンが使いたかったので、Getopt::Long についても調べました。
#!/usr/bin/perl
#
# GetOptions-template.pl
#

use Getopt::Long ;

sub usage_exit {
        print STDERR "Usage: getopts-template.pl [-a] [-b] [-d dir] item1 item2 ...\n" ;
        exit 1 ;
}

print "@ARGV\n" ;       ####DEBUG
{
        local $SIG{__WARN__} = \&usage_exit ;
        GetOptions( "a" => \$opt_a, "b+" => \$opt_b, "d=s" => \$opt_d, "h" => \$opt_h ) ;
        ### see man Getopt::Long(3pm)
}

if (defined $opt_h) {
        usage_exit ;
}

$argc = scalar @ARGV ;
print "\$argc=$argc\n" ;        ####DEBUG
print "\@ARGV=@ARGV\n" ;        ####DEBUG
print "\$opt_a=$opt_a\n" ;      ####DEBUG
print "\$opt_b=$opt_b\n" ;      ####DEBUG
print "\$opt_d=$opt_d\n" ;      ####DEBUG
オンラインマニュアル(man Getopt::Long(3pm))によると、プラス記号を使うと、同じオプションの複数回指定に対応できるとのことなのですが、実際に試してみると、、、
# ./GetOptions-template.pl -a -bb
-a -bb
Usage: getopts-template.pl [-a] [-b] [-d dir] item1 item2 ...

# ./GetOptions-template.pl -a -b -b
-a -b -b
$argc=0
@ARGV=
$opt_a=1
$opt_b=2
$opt_d=
残念ながら、複数回指定可能と言っても、このように -bb とは指定できず、-b -b という具合に指定する必要があるようです。コードは少し長くなりますが、getoptコマンドを使う方法なら対応できます。
人気ブログランキングへ にほんブログ村 IT技術ブログへ