前に、
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コマンドを使う方法なら対応できます。