Getopt で引数を解析するときに未定義のオプションを許可するにはどうすればよいですか
-
25-09-2019 - |
質問
次のようなコマンドラインがあるとします。
my_script.pl -foo -WHATEVER
私のスクリプトは次のことを知っています --foo
, そして、Getoptに変数を設定してもらいたい $opt_foo
, 、でも何も知りません -WHATEVER
. 。Getopt に、指定したオプションを解析してから文字列変数またはリスト内の残りの引数を取得するように指示するにはどうすればよいでしょうか?
例:
use strict;
use warnings;
use Getopt::Long;
my $foo;
GetOptions('foo' => \$foo);
print 'remaining options: ', @ARGV;
次に、発行
perl getopttest.pl -foo -WHATEVER
与える
Unknown option: whatever remaining options:
解決
「pass_through」オプションを設定する必要があります。 Getopt::Long::Configure("pass_through");
その後、実際のオプションをサポートします (例:「-」で始まり、「実際の」オプションの終わりを示す特別な「--」区切り文字を除いたもの)。
これがperldocの引用です:
pass_through (デフォルト:無効)
不明なオプション、あいまいなオプション、または無効なオプション値が指定されたオプションは、次のように渡されます。
@ARGV
エラーとしてフラグが立てられる代わりに。これにより、ユーザーが指定したコマンド ライン引数の一部のみを処理し、残りのオプションを他のプログラムに渡すラッパー スクリプトを作成することが可能になります。
ここに例があります
$ cat my_script.pl
#!/usr/local/bin/perl5.8 -w
use Getopt::Long;
Getopt::Long::Configure("pass_through");
use Data::Dumper;
my %args;
GetOptions(\%args, "foo") or die "GetOption returned 0\n";
print Data::Dumper->Dump([\@ARGV],["ARGV"]);
$ ./my_script.pl -foo -WHATEVER
$ARGV = [
'-WHATEVER'
];
他のヒント
ではない残りの(解析対象外)の値は、単に@ARGV
に残されていますか?あなたの余分なコンテンツがダッシュで始まる場合、あなたは--
でオプションリストの終わりを示す必要があります。
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Data::Dumper;
my $foo;
my $result = GetOptions ("foo" => \$foo);
print Dumper([ $foo, \@ARGV ]);
次に呼び出します:
my_script.pl --foo -- --WHATEVER
与えます:
$VAR1 = [
1,
[
'--WHATEVER'
]
];
PS。 MooseX :: Getoptののでは、コマンドラインから「残り」オプションが置かれ配列リファレンスとしてextra_argv
属性に - !私は、変換をお勧めしたいので、
私は「いいえ、あなたは自分で@ARGVを解析せず、Getoptの::ロングを使用して、聞いて、正確に同じようにそれを行う方法がありません。」で、悲しいことに、しかし、ここで答えを考えますエーテルはかかわらず、まともな回避策があります。それは限り任意のオプションのような引数がエラーとして捕獲されていることをほとんどの人が懸念しているなどの特徴です。通常、あなたが行うことができます。
GetOptions('foo' => \$foo)
or die "Whups, got options we don't recognize!";
キャプチャに/渡されてから奇妙なオプションを防ぎ、その後、あなたは、使用上のユーザを修正することができます。また、あなたは、単に通過し、それらを無視することができます。