綾小路龍之介の素人思考

[perl] Getopt::Longで同じオプション名で複数個の引数を受け取るには@を

複数個の引数を同じオプション名で受け取る方法。スカラーからハッシュにするだけ。

例えば以下の場合、--tagで受け取れるオプションは最後につけたものだけが$opts{tag}に格納される。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Getopt::Long;

my %opts = ();
GetOptions( \%opts, 'tag=s');

print Dumper \%opts;

exit;

下のように引数を与えた場合は、--tagで指定した最後の引数であるtag2が$opts{tag}の値になる。また、--tagの数が1の場合はそのときの値が格納される。

$ perl hoge.pl --tag tag0 --tag tag1 --tag tag2
$VAR1 = {
          'tag' => 'tag2'
        };
$ perl hoge.pl --tag tag0
$VAR1 = {
          'tag' => 'tag0'
        };

以下のようにGetOptionsのtagオプションに関する引数に@をつけると、$opt{tag}は配列リファレンスになり、--tagで指定された引数を格納するようになる。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Getopt::Long;

my %opts = ();
GetOptions( \%opts, 'tag=s@');

print Dumper \%opts;

exit;

したがって、以下のようになる。--tagの指定回数に依らず、$opt{tag}のデータ構造は配列リファレンスで全ての引数の値を格納する。

$ perl hoge.pl --tag tag0 --tag tag1 --tag tag2
$VAR1 = {
          'tag' => [
                     'tag0',
                     'tag1',
                     'tag2'
                   ]
        };
$ perl hoge.pl --tag tag0
$VAR1 = {
          'tag' => [
                     'tag0'
                   ]
        };

リファレンス

  1. Getopt::Long - search.cpan.org

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-05-09T21:21:45+09:00
  2. Modified: 2010-05-09T21:21:45+09:00
  3. Generated: 2017-04-13T23:10:21+09:00