【Perl】Getopt::Longモジュールのメモ
Perlのモジュール「Getopt::Long」を使うときのメモ。
コマンドライン引数の処理に使う
Getopt::Longモジュールはコマンドライン引数の処理を請け負ってくれる。
テストスクリプトを書く
スクリプトをコマンドプロンプトで実行する際に、3つの引数を受け取り、値に応じて文字を出力するテストスクリプトを書いてみる。
#!/usr/local/bin/perl
# -*- Encoding: UTF-8 -*-
use strict;
use warnings;
use utf8;
use Encode::Locale;
binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";
binmode STDERR, ":encoding(console_out)";
Encode::Locale::decode_argv;
use Getopt::Long qw(:config posix_default no_ignore_case);
my %opts = (
'cat' => 0,
'name' => 'まだ無い',
'cry' => 1,
);
GetOptions(\%opts, qw/cat|C name|n=s cry|c=i/);
$opts{'cry'} ||= 1;
print "吾輩は";
if ($opts{'cat'}) {
print "猫である。";
}
else {
print "猫ではない。";
}
print "名前は$opts{'name'}。";
if ($opts{'cry'} > 1) {
print "ニャー、" x ($opts{'cry'} - 1);
}
print "ニャーと試みにやって見たが誰も来ない。\n";
exit;
16行目の「Encode::Locale::decode_argv;」を書いておくとコマンドライン引数も環境に応じてデコードしてくれる。
18行目の「use Getopt::Long qw(:config posix_default no_ignore_case);」でGetopt::Longモジュールの基本的な動作を設定している。デフォルトのまま使うと危険らしい(後述する「参考にしたブログ記事」を参照)。
26行目の「GetOptions(\%opts, qw/cat|C name|n=s cry|c=i/);」で受け取る引数の設定をしている。コマンドラインから受け取った値はハッシュ%optsに入れる。デフォルト値は20行目から24行目で設定。
- 「cat」は猫かどうかのフラグ。引数に「--cat」(-cat、-C、--Cでも可)があると$opts{'cat’}に1が入る。
- 「name」は名前なので文字列を受け取る(=sを付ける)。引数「--name=タマ」(-name、-n、--nでも可)を付けた場合は$opts{'name’}にタマが入る。
- 「cay」は鳴く回数なので数字を受け取る(=iを付ける)。例えば引数「--cry=2」(-cry、-c、--cでも可)を付けた場合は$opts{'cry’}に2が入る。
ハイフン2個の書き方をしたときはイコールはあっても無くても良いが、ハイフン1個の時はイコールは付けないこと。
コマンドプロンプトで実行する
「cat」をオン、「cry」を2にして実行してみると、思ったとおりの動作をしました。
C:\home\perl>perl test_getopt_long.pl --cat --cry=2 吾輩は猫である。名前はまだ無い。ニャー、ニャーと試みにやって見たが誰も来ない。
鳴く回数を増やす。必ず1回以上鳴くようにしているので「cry」に0以下の値を入れても1回は鳴きます。
C:\home\perl>perl test_getopt_long.pl --cat --cry=3 吾輩は猫である。名前はまだ無い。ニャー、ニャー、ニャーと試みにやって見たが誰も来ない。
今度は「name」を与えてみる。名前はタマになりました。
C:\home\perl>perl test_getopt_long.pl --cat --name=タマ --cry=2 吾輩は猫である。名前はタマ。ニャー、ニャーと試みにやって見たが誰も来ない。
「cat」をオフ(–catを書かない)にしてみると、猫ではないのにニャーと鳴いてるけど想定通りに動く。
C:\home\perl>perl test_getopt_long.pl --name=タマ --cry=2 吾輩は猫ではない。名前はタマ。ニャー、ニャーと試みにやって見たが誰も来ない。
設定していない引数(age)を与えるとアラートが出るようです。
C:\home\perl>perl test_getopt_long.pl --cat --cry=2 --age=10 Unknown option: age 吾輩は猫である。名前はまだ無い。ニャー、ニャーと試みにやって見たが誰も来ない。
参考にしたブログ記事
たごもりすメモさんの記事。
おそらくはそれさえも平凡な日々さんの記事。
過去の同じ日の記事一覧
Engin AkyurtによるPixabayからの画像を使用しています。
ディスカッション
コメント一覧
まだ、コメントがありません