1. ホーム
  2. スクリプト・コラム
  3. パール
  4. アプリケーションのヒント

Perl の Getopt::Long モジュールを使用して、ユーザーのコマンドライン引数を受け取ります。

2022-01-29 07:52:34

Linux ではプログラムに引数を追加する必要があることが多いので、引数を制御するために Perl のモジュール Getopt::Long を見ておくと、@ARGV の配列を直接使うよりずっと強力です。Linuxでは引数には2つの形式があることはご存知だと思います。

-ヘルプ
-短い引数 -h
つまり、-と-の違いです。-はフルパラメータ。- は簡略化された引数の場合です。どちらもPerlのこのモジュールでもサポートされています。
Getopt モジュールは、Getopt::Long と Getopt::Std という 2 つのモジュールがあります。

Getopt::Long モジュール
Perl のコマンドラインで受け付けられる引数を初期化し、コマンドライン引数の解析を簡略化します。以下はプログラムの例です。

コピーコード コードは以下の通りです。

#! /usr/bin/perl
use strict;
use Getopt::Long;
use Smart::Comments;
my @libs = (); 
my %flags = (); 
my ( $verbose, $all, $more, $diam, $debug, $test, $step);
GetOptions(
        'verbose+' => \$verbose,
        'more!' => \$more,
        'debug:i' => \$debug,
        'lib=s' => \@libs,
        'flag=s' => \%flags,
        'test|t' => \$test,
        'all|everything|universe' => $all,
);
### $verbose
### $more
### $debug
### $test
### @libs;
### %flags

この方法が使われています、以下は詳しい説明です、部分の前の=>のGetOptionsに注意してください。以下は詳細な説明です。

-'verbose+' オプションの + は変数を取らないので、内容を続ける必要はありません。ただ使うだけで、登場するたびに変数が追加され、つまり、引数で行について語るときに-verbose -verboseが2回登場するとverboseの値が2になる。
-'more!' with !オプションは変数を取らず(つまり、-more引数を付けなくても使える)、コマンドラインに現れるたびにデフォルトで1になり、機能のオンとオフを設定するために使われます>. パラメータにnoを付けると、-nomoreのように負の値になります。
-'flag=s' は文字列を = で受け取り、文字列 (s)、整数 (i)、または浮動小数点 (f) 変数を必要とします。
-'debug:i' を : オプションで指定すると、デフォルトが 0 のオプション変数か、空の文字列を受け取ります。
-'test|t' の後に | が続くと、-test を -t と省略できることを意味します。
-'lib=s' => @libs この場合の @libs のように、関連する変数が配列である場合、オプションは複数回出現し、値を配列にプッシュすることが可能です。
-'flag=s' => %flags 関連する変数がハッシュの場合、キー=値のペアが必要で、ハッシュに挿入されます。

備考
     パラメータ名を照合する場合、GetOptions はデフォルトで大文字と小文字を無視し、デフォルトのパラメータは固有の最短文字列(最初の文字)に短縮されます(例えば、-more は -m です。同じ最初の文字が2番目の文字として追加され、区別される)

Getoptモジュールのプログラムでは、以下のメソッドを使用します。

上記の例に従って、test.plというプログラムを書くとしよう。あとは、コマンドラインに以下のパラメータを追加するだけです。

コピーコード コードは以下の通りです。
$ . /test.pl --verbose --verbose -v --more \ --lib='/lib' -l '/lib64' --f a=1 --flag b=2 --debug 2 -t fukai

ちょっと長いですが、上記を見ていただければ、イメージはつかめると思います。今回はSmart::Commentモジュールを使っているので、一番下の###は変数の内容そのものを出力しています。これも超強力なモジュールです。では、これらのパラメータを見てみましょう。これらのパラメータを入力したときに何が出力されるかを見てみましょう。

コピーコード コードは以下の通りです。

### $verbose: 3
### $more: 1
### $debug: 2
### @libs: [
### '/lib',
### '/lib64'
### ]
### %flags: {
### a => '1',
### b => '2'
### }

上で入力したパラメータを確認して、イメージをつかんでください。

Getoptモジュールの簡単な概要

(1)プログラム内部に有効なパラメータが渡される
パラメータタイプ: 整数、浮動小数点、文字列

コピーコード コードは以下の通りです。

GetOptions(
    'tag=s' => \$tag
);

'=' はパラメータに値が必要なことを意味し、':' に置き換えた場合はパラメータに値が必要ないことを意味します。
s' は文字列の引数を渡すこと、'i' は整数の引数を渡すこと、'f' は浮動小数点の引数を渡すことを意味します。

値を持つパラメータに使用されるメソッド

コピーコード コードは以下の通りです。

$ test.pl --tag=string
$ test.pl --tag string

(2) 複数の値をプログラムへ転送する必要があるパラメータ。
例えば、@libfilesに複数の値を渡す必要があるアクションメソッド。

コピーコード コードは以下の通りです。

GetOptions ("library=s" => \@libfiles);
GetOptions ("library=s@" => \$libfiles);

タグに渡されるパラメータ
使用メソッド

コピーコード コードは以下の通りです。
$ test.pl --library lib/stdlib --library lib/extlib

(3) キー・バリュー・ペアのパラメータ渡し

時には、いくつかのキーと値のペアをプログラムに渡して処理する必要があるため、この機能を使用する必要があります。

コピーコード コードは以下の通りです。

GetOptions ("define=s" => \%defines);
GetOptions ("define=s%" => \$defines);

使用メソッド

コピーコード コードは以下の通りです。
$ test.pl --define os=linux --define vendor=redhat

  (4) パラメータのエイリアス
省略形など、パラメーターの別名が必要な場合は、次のようにします。

コピーコード コードは以下の通りです。
GetOptions ('length|height=f' => \$length);

最初の名前はプライマリ名、他の名前はエイリアス(複数のエイリアス名を持つことができる)、ハッシュパラメータを使用する場合は、プライマリ名がキー値として使用されます。