PerlのGetopt::LongモジュールにはGetOptionsFromArrayという関数が有る
Getopt::Longは、@ARGVを解析して、コマンドラインオプションを抜き出してくれる標準モジュール。コマンドラインオプション以外の引数は、そのまま@ARGVに残る(ファイル名とかね)。
試しにこんなコードを書いてみます。
getopt1.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long;
{
local @ARGV = @ARGV;
my $option_value;
GetOptions("o|option=s" => \$option_value);
if ($length) {
print "Command line option is $option_value.\n";
}
print 'Current local @ARGV is ';
print "@ARGV.\n";
}
print 'Orignal @ARGV is ';
print "@ARGV.\n";
実行すると、結果はこうなります。
$ perl getopt1.pl filename -o test_option
Command line option is test_option.
Current local @ARGV is filename.
Orignal @ARGV is filename -o test_option.
グローバル変数である@ARGVをいきなり書き換えるのはちょっとお行儀が悪いので、localで再定義した@ARGVで受ける様に書きましたが、いちいちlocal @ARGV=@ARGVというコードを書くのも、若干回りくどいし、分かりづらいですよね(グローバル変数を隠蔽するlocal変数はみんな分かりづらいコードの原因になります...)。
最近のGetopt::Longモジュール(Ver.2.36以降)には、任意の配列からオプションを取得するGetOptionsFromArray関数が追加されています。
GetOptionsFromArrayを使って書き換えると、下の様になります。
getopt2.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long qw(GetOptionsFromArray);
{
my @args = @ARGV;
my $option_value;
GetOptionsFromArray(\@args, "o|option=s" => \$option_value);
if ($option_value) {
print "Command line option is $option_value.\n";
}
print 'Current @args is ...';
print "@args.\n";
}
print 'Orignal @ARGV is ...';
print "@ARGV.\n";
実行結果は下の様になります。
$ perl getopt2.pl filename -o test_option
Command line option is test_option.
Current @args is ...filename.
Orignal @ARGV is ...filename -o test_option.
当たり前ですが、同じ結果が表示されました。
コードが全部一つの.plに入っているようなコードでは直接@ARGVを書き換えてしまっても、あまり影響は無いと思いますが、なるべくグローバル変数を使わない(更に勝手に書き換えない)というのは大事なお作法なので、この様なコードの書き方をしたいところです。
でも残念な事に、Getopt::LongのVer.2.36が標準モジュール入りしたのはPerl 5.8.9以降(リリース順で言えば、Perl 5.10.0以降)なので、Perlのバージョンによっては最新バージョンをCPANからインストールする必要が有ります。
$ corelist -a Getopt::Long
Getopt::Long was first released with perl 5
5 undef
v5.10.0 2.37
v5.8.0 2.32
v5.8.1 2.34
v5.8.2 2.34
v5.8.3 2.34
v5.8.4 2.34
v5.8.5 2.34
v5.8.6 2.34
v5.8.7 2.34
v5.8.8 2.35
v5.8.9 2.37
v5.9.0 2.34
v5.9.1 2.3401
v5.9.2 2.3401
v5.9.3 2.35
v5.9.4 2.3501
v5.9.5 2.36
v5.10.0 2.37
(表示は一部省略しています)
地味に進化しているGetopt::Longの関数紹介でした。











