2013年もGetopt::Long(後編)
という訳で、前回の続き。
pod2usageとか、long optionとshort optionとか。
参考にしたページ
2013年のGetopt::Long – おそらくはそれさえも平凡な日々
http://www.songmu.jp/riji/archives/2013/02/2013getoptlong.html
PODからUsageを生成する
use strict;
use warnings;
use v5.10;
use Getopt::Long qw/:config posix_default no_ignore_case bundling auto_help/;
use Pod::Usage qw/pod2usage/;
my %opt = ();
GetOptions(
\%opt,
'foo=i'
) or pod2usage(1);
pod2usage(2) if ( not exists $opt{foo} );
say 'foo = ', $opt{foo};
__END__
=head1 DESCRIPTION
pod2usage sample
=head1 SYNOPSIS
perl iii.pl --foo <integer>
=cut
上記のソースを”iii.pl”に保存して、
以下のように実行すると、
$ perl iii.pl
Usage:
perl iii.pl --foo <integer>
この通り、GetOptions()が失敗するとpod2usage()が呼ばれ、
PODからUsageが生成される。
pod2usage()の引数は終了ステータスに使用されるので、
以下の方法で確認することが出来る(*1)。
$ perl iii.pl; echo $?
Usage:
perl iii.pl --foo <integer>
2
ちなみに、オプションに整数以外を指定すると、
以下のような結果になる。
$ perl iii.pl --foo aaa; echo $?
Value "aaa" invalid for option foo (number expected)
Usage:
perl iii.pl --foo <integer>
1
オプションに整数を指定した場合は、以下の通り。
$ perl iii.pl --foo 2; echo $?
foo = 2
0
あと、use Getopt::Longにauto_helpを指定すると、
--helpを付けて実行した際に、Usageが表示される。
$ perl iii.pl --help; echo $?
Usage:
perl iii.pl --foo <integer>
0
終了ステータスを見る限り、
pod2usage(0)が呼ばれてるっぽい。
PODを読む限り、--helpの他に、-?でも良いみたいだけど、
-hが含まれてない点がちょっと気になるところ。
「long option」と「short option」
bundlingが指定されていると、
-hogeが、-h -o -g -eとして扱われる。
なので、これまで先頭にハイフンを2つ付けた--hogeを使ってきた。
このハイフンを2つ付けたオプションを「long option」、
1つだけ付けたオプションを「short option」って呼ぶらしい。(*2)
use strict;
use warnings;
use v5.10;
use Getopt::Long qw/:config posix_default no_ignore_case bundling auto_help/;
use Pod::Usage qw/pod2usage/;
my %opt = ();
GetOptions(
\%opt,
'foo|f=i'
) or pod2usage(1);
pod2usage(2) if ( not exists $opt{foo} );
say 'foo = ', $opt{foo};
__END__
=head1 DESCRIPTION
pod2usage sample
=head1 SYNOPSIS
perl jjj.pl --foo|-f <integer>
=cut
上記のソースを”jjj.pl”に保存して、
以下のように実行すると、
$ perl jjj.pl -f 3
foo = 3
という訳で、'foo=i'を'foo|f=i'に変更しただけで、
short optionの-fでも引数を受け取れるようになった。
ついでなので、PODも修正した。
ちなみに、'foo|f=i'は、'f|foo=i'とは書けないのと、
$opt{f}には、引数が格納されない点に注意する。
これは、-fでも--fooでも、$opt{foo}に引数が格納されるという意味。
という訳で、自分が使う分にはこれで一通り。
おしまい。
(*1) 実行環境は、MacOS X 10.7.5上で起動したターミナル。
(*2) 正式名称はわかんないです、ごめんなさい。
Leave a Comment