18 October 2009

memo: perlでコマンドラインオプションを使う。__DATA__ トークンでソースコードにデータを埋め込む

Getopt

Recipe 15.1. Parsing Program Arguments

Getopt::Std, Getopt::Long を使うと、cのgetopt()関数のように、コマンドラインオプションを便利に扱うことができます。

Synopsys
use Getopt::Long;

my ($xmin, $xrange, $ymin, $yrange, $zmin, $zrange, $delimiter, $help);

GetOptions("xmin=i" => \$xmin,
   "xrange=i" => \$xrange,
   "ymin=i" => \$ymin,
   "yrange=i" => \$yrange,
   "zmin=i" => \$zmin,
   "zrange=i" => \$zrange,
   "delimiter|del=s" => \$delimiter,
   "h|help" => \$help);
解説

Getopt::Longの解説です。cのgetopt()のように、コマンドラインオプション(-o とか --prefix=foo など)を扱いやすくするモジュールです。GetOptions()関数に、"オプション名" => "結果を格納する変数のリファレンス"というハッシュを渡すと、オプションをパースして結果を変数に格納してくれます。またオプションの使い方に制約を持たせることもでき、例えば、"option=s"とすると、stringのパラメータを必ず渡さなければいけない(--option=foo のように呼び出す)という制約付きのオプションができて、守られてない場合はエラーを出してくれます。その他にもオプションを"|"で区切ることでorをになったりします。

Getopt::Longは複数文字のオプションを扱いますが、Getopt::Stdは一文字だけのオプションを扱います。例えば、getopt("a")とすると、その値が$otp_aに格納されます。

__DATA__

Recipe 7.6. Storing Files Inside Your Program Text

__DATA__トークンを使うと、スクリプト内にデータを直接埋め込むことができます。__DATA__は普通のファイルを扱うように処理できます。

Synopsys
for my $line () {
    print $line;
}

__DATA__
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
解説

__DATA__ 以降の文字列がデータとして扱われます。ループの部分で行っているように、普通のファイルのように扱うことができます。