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::Longauto_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