Subscribed unsubscribe Subscribe Subscribe

oinume journal

Scratchpad of what I learned

コマンドラインオプションを解析するPerlモジュールGetopt::Compact

Perl

Perlコマンドラインオプションを解析する場合、大体は標準添付されているGetopt::Longを使うと思いますが、自分は3年前ぐらいから Getopt::Compact というモジュールに出会い、それ以降大抵の場合はこれを使っています。このモジュールの良いところは

 

 

  • オプションの定義(-c, --config などの定義)とそのヘルプメッセージが一箇所で定義できる

 

 

  • -h, --helpオプションを最初から定義してくれてる(--manオプションも)

 

 

  • 定義してないオプションが指定されると自動的にエラーにしてくれる

 

 

  • Getopt::Compact#usage でヘルプメッセージが簡単に取得できる

 

 

があると思っています。などと抽象的な話をしてもしょうがないので、具体的なコードを書いてみます。

 

 

#!/usr/bin/env perl

 

use strict;

use warnings;

use Getopt::Compact;

use Data::Dumper;

 

my $getopt = Getopt::Compact->new(

name => 'getopt_compact.pl',

modes => [ qw(verbose) ],

args => 'FILE',

version => '0.1',

struct => [

[ [ qw(f force) ], 'force overwrite of output file and compress links' ],

[ [ qw(l level) ], 'compress level', '=i' ],

[ [ qw(S suffix) ], 'use suffix on compressed files', '=s' ],

]

);

 

my $options = $getopt->opts;

my $file = shift @ARGV;

unless ($file) {

print STDERR $getopt->usage;

exit 1;

}

 

print "options -----\n";

print Dumper $options;

 

 

上の例では gzip のオプションのモノマネで

 

 

  • -f, --forceというフラグオプション

 

 

  • -l, --levelという数値のオプション

 

 

  • -S, --suffixという文字列のオプション

 

 

  • オプション以外に引数FILEを受け取る

 

 

という仕様としています。

 

でで、例えば

 

$ perl getopt_compact.pl --help

 

と実行すると

 

getopt_compact.pl v0.1

usage: getopt_compact.pl [options] FILE

options

-h, --help This help message

-v, --verbose Verbose mode

-f, --force Force overwrite of output file and compress links

-l, --level Compress level

-S, --suffix Use suffix on compressed files

--man Display documentation

 

のようにヘルプが表示されます。また、--hoge のような存在しないオプションを指定すると

 

$ perl getopt_compact.pl --hoge

Unknown option: hoge

getopt_compact.pl v0.1

usage: getopt_compact.pl [options] FILE

options

-h, --help This help message

-v, --verbose Verbose mode

-f, --force Force overwrite of output file and compress links

-l, --level Compress level

-S, --suffix Use suffix on compressed files

--man Display documentation

 

のようにエラーになりヘルプが表示されます。

 

という感じで、Getopt::Longより依存モジュールがあるものの便利に使わせてもらってます。ただ、PerlのGetopt系のモジュールは他にも色々あるのでもっと便利なのがありそうですが、こういうのもあるよという紹介でした。

 

[tmkm-amazon]4798119172[/tmkm-amazon]