私は perl の初心者なので、この質問に辛抱強く対応してください。
perl Getopts::Long::GetOpts メソッドを複数回呼び出すと、2 回目の呼び出しは完全に無視されるようです。
これは正常ですか??(なぜ)
このプロセスの代替手段は何ですか??
(実際には、GetOpts 呼び出しを行うモジュールを作成しました。モジュールを使用するスクリプトもそれを実行しようとしますが、スクリプトは必要なオプションを取得していないようです)
ありがとう、ニーラジ
私は perl の初心者なので、この質問に辛抱強く対応してください。
perl Getopts::Long::GetOpts メソッドを複数回呼び出すと、2 回目の呼び出しは完全に無視されるようです。
これは正常ですか??(なぜ)
このプロセスの代替手段は何ですか??
(実際には、GetOpts 呼び出しを行うモジュールを作成しました。モジュールを使用するスクリプトもそれを実行しようとしますが、スクリプトは必要なオプションを取得していないようです)
ありがとう、ニーラジ
Getopts::Longは動作中に変更されます。これにより、スイッチの処理が完了したときに、@ARGV
スイッチ以外の値を残すことができます。@ARGV
そのため、2 回目の呼び出しを行うと、@ARGV
解析するものが何も残っておらず、有用なことは何も起こりません。
ただし、次のようなことがありGetOptionsFromArray
ます。
デフォルトでは、GetOptions はグローバル配列に存在するオプションを解析します
@ARGV
。特別なエントリ GetOptionsFromArray を使用して、任意の配列からオプションを解析できます。
したがって、リストを複数回解析する必要がある場合は、(または他の配列)GetOptionsFromArray
のコピーを使用できます。@ARGV
GetOpts::Long
1つのプログラムで複数回GetOptions を実行しました。私が持っているのは、.optrc
コマンド ラインでオーバーライドできるコマンド ライン オプションを含むファイルです。ほとんど同じよう.cvsrc
に.exrc
動作します。
これを行うには、.optrc ファイルに対して GetOptions を実行し、.optrc の内容を実行します@ARGV
。古いバージョンの GetOptions では、 を保存して @ARGV に@ARGV
投げ込み、 で処理してから、その上で GetOptions を復元して実行する必要がありました。GetOpts::Long の新しいバージョンでは、単に使用する代わりに配列を指定できるようになりました。.optrc
GetOptions
@ARGV
@ARGV
@ARGVのコピーを作成すると、同じオプションのセットを何度も解析するのに忙しくなります。これがあなたが望むものなら、結構です。だが。
@ARGVのサブセットのみを認識できる、プログラムで使用しているモジュールのセットがあるとします。これらの各モジュールからGetOptionsを呼び出し、モジュールが認識できる各オプションを使用して、@ARGVの残りのオプションを他のモジュールで処理できるようにします。
Getopt :: Longを設定して、これを行うには、
Getopt::Long::Configure qw/pass_through/;
ただし、さまざまな構成の副作用については、perldoc Getopt ::Longを参照してください。
例:いくつかのオプションと2つのモジュール(o1::p1とo1::p2)を認識できるスクリプト(o1.pl)は、独自のオプションを読み取る必要があります
o1.pl:
use Getopt::Long;
use o1::p1;
use o1::p2;
# now o1::p1 and o1::p2 already consumed recognizable options
#no need to configure pass_through since main:: will get to see only its options
#Getopt::Long::Configure(qw/pass_through/);
my %main_options = ( 'define' => {}, );
print "main: \@ARGV = " . join (', ', @ARGV) . "\n";
GetOptions(\%main_options, "main-vi=i","verbose",'define=s');
use Data::Dumper;
print "main_options: ", Dumper(\%main_options);
print "p1 options: ", Dumper(\%o1::p1::options);
print "p2 options: ", Dumper(\%o1::p2::options);
exit 0;
o1 :: p1ソース(o1 / p1.pm内):
package o1::p1;
use Getopt::Long;
Getopt::Long::Configure qw/pass_through/;
%options = ();
print "package p1: \@ARGV = " . join (', ', @ARGV) . "\n";;
GetOptions(\%options, "p1-v1=s", "p1-v2=i");
1;
o1 :: p2ソース(o1 / p2.pm内):
package o1::p2;
use Getopt::Long;
Getopt::Long::Configure 'pass_through';
%options = ();
print "package p2: \@ARGV=". join (', ', @ARGV). "\n";
GetOptions(\%options, "p2-v1=s", "p2-v2=i");
1;
次のコマンドでo1.plを実行します。
perl o1.pl --main-vi=1 --verbose --define a=ss --p1-v1=k1 --p1-v2=42 --define b=yy --p2-v1=k2 --p2-v2=66
次の(期待される)出力が得られます(p1がオプションを消費し、次にp2がそれを実行し、次にmainに既知の情報が残されました):
package p1: @ARGV = --main-vi=1, --verbose, --define, a=ss, --p1-v1=k1, --p1-v2=42, --define, b=yy, --p2-v1=k2, --p2-v2=66
package p2: @ARGV=--main-vi=1, --verbose, --define, a=ss, --define, b=yy, --p2-v1=k2, --p2-v2=66
main: @ARGV = --main-vi=1, --verbose, --define, a=ss, --define, b=yy
main_options: $VAR1 = {
'verbose' => 1,
'define' => {
'a' => 'ss',
'b' => 'yy'
},
'main-vi' => 1
};
p1 options: $VAR1 = {
'p1-v1' => 'k1',
'p1-v2' => 42
};
p2 options: $VAR1 = {
'p2-v1' => 'k2',
'p2-v2' => 66
};
これこそが「ローカル」というキーワードの本来あるべき姿ではないでしょうか。
{
local @ARGV = @ARGV;
our $opt_h;
&getopts('h');
&printUsage if $opt_h;
}
# Now that the local version of @ARGV has gone out of scope, the original version of @ARGV is restored.
while (@ARGV){
my $arg = shift @ARGV;