【Perl】Getopt::Longモジュールのメモ

2023年11月23日

【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からの画像を使用しています。

お読みくださりありがとうございます。この記事が何かの参考になりましたら、ブログランキングサイトのバナークリックをよろしくお願いします。

ブログランキング・にほんブログ村へ 人気ブログランキング FC2 ブログランキング