19

次のようなコマンドラインがある場合:

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

与える

不明なオプション:何でも
残りのオプション:
4

3 に答える 3

23

を介して「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'
        ];
于 2010-06-08T23:53:47.970 に答える
1

残りの(解析されていない)値は単に残されたものではあり@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_argvarrayrefとして属性に配置されるため、変換することをお勧めします。

于 2010-06-08T23:41:30.467 に答える
0

残念ながら、ここでの答えは、「いいえ、@ ARGVを自分で解析せずに、Getopt :: Longを使用して、要求どおりに実行する方法はありません」と思います。ただし、Etherには適切な回避策があります。ほとんどの人がオプションのような引数がエラーとしてキャプチャされることを懸念している限り、これは機能です。通常、あなたはすることができます

GetOptions('foo' => \$foo) 
    or die "Whups, got options we don't recognize!";

奇妙なオプションが渡されるのをキャプチャ/防止し、使用時にユーザーを修正できます。または、単に通過して無視することもできます。

于 2010-06-08T23:50:38.447 に答える