1

私が書いている perl スクリプトには、たくさん (~50) のコマンド ライン オプションが用意されている場合があります。それらのほとんどはオプションであるため、呼び出しには提供されるオプションの一部のみが含まれます。

使用していますが、複数回Getopt::Long使用することはできません。GetOptionsその結果、1 回のGetOptions呼び出しですべてのコマンド ライン オプションを使用する必要があります。

使用中にオプションをグループ化する良い方法はありますGetOptionsか?

$ cat test.pl
use strict;
use warnings;
use Getopt::Long;

my ($a, $b, $c, $d);

GetOptions ('a=s' => \$a, 'b=s' => \$b);
GetOptions ('c=s' => \$c, 'd=s' => \$d);

print "a = $a\nb = $b\nc = $c\nd = $d\n";

$ perl test.pl -a=AA -b=BB -c=CC -d=DD
Unknown option: c
Unknown option: d
Use of uninitialized value in concatenation (.) or string at test.pl line 10.
Use of uninitialized value in concatenation (.) or string at test.pl line 10.
a = AA
b = BB
c = 
d = 
$
4

4 に答える 4

6

代わりに、オプションをハッシュに保存することをお勧めします。

参照Getopt::Long: オプション値をハッシュに保存:


多くのオプションがある場合など、オプションごとに個別の変数を用意するのは面倒な場合があります。GetOptions()代替メカニズムとして、オプション値をハッシュに格納することをサポートしています。

これを取得するには、ハッシュへの参照を の最初の引数として渡す必要がありますGetOptions()。コマンドラインで指定されたオプションごとに、オプション名をキーとしてオプション値がハッシュに格納されます。コマンドラインで実際に使用されていないオプションはハッシュに入れられません。つまり、 exists($h{option})(またはdefined()) を使用して、オプションが使用されたかどうかをテストできます。欠点は、プログラムが use strict および uses $h{option}without testing withexists()またはdefined() first で実行されている場合に警告が発行されることです。

my %h = ();
GetOptions (\%h, 'length=i');       # will store in $h{length}

リストまたはハッシュ値を取るオプションの場合、タイプの後に @ または % 記号を追加して、これを示す必要があります。

GetOptions (\%h, 'colours=s@');     # will push to @{$h{colours}}

さらに複雑にするために、ハッシュには実際の宛先への参照が含まれる場合があります。次に例を示します。

my $len = 0;
my %h = ('length' => \$len);
GetOptions (\%h, 'length=i');       # will store in $len

この例は、次のものと完全に同等です。

my $len = 0;
GetOptions ('length=i' => \$len);   # will store in $len

任意の混合が可能です。たとえば、最も頻繁に使用されるオプションを変数に格納し、他のすべてのオプションをハッシュに格納できます。

my $verbose = 0;                    # frequently referred
my $debug = 0;                      # frequently referred
my %h = ('verbose' => \$verbose, 'debug' => \$debug);
GetOptions (\%h, 'verbose', 'debug', 'filter', 'size=i');
if ( $verbose ) { ... }
if ( exists $h{filter} ) { ... option 'filter' was specified ... }
于 2010-11-12T10:31:36.083 に答える
2

最も直接的な答えは、次のように Getopt::Long::Configure を使用することです。

use strict;
use warnings;
use Getopt::Long;

my ($a, $b, $c, $d);

Getopt::Long::Configure( qw(pass_through) );
GetOptions ('a=s' => \$a, 'b=s' => \$b);

Getopt::Long::Configure( qw(no_pass_through) );
GetOptions ('c=s' => \$c, 'd=s' => \$d);

print "a = $a\nb = $b\nc = $c\nd = $d\n";

GetOptions の最後の呼び出しが no_pass_through で構成されていることを確認して、不明なオプションに関する警告が表示されるようにする必要があることに注意してください。

% perl test_getop.pl -a AA -b BB -c CC -d DD -e EE
Unknown option: e
a = AA
b = BB
c = CC
d = DD
于 2011-06-08T17:57:37.773 に答える
1

どうしたの:

GetOptions(
  'a=s' => \$a,
  'b=s' => \$b,
  'c=s' => \$c,
  'd=s' => \$d,
);

または、それらがすべて短い場合は、次のようにすることができます。

GetOptions(
  'a=s' => \$a,   'b=s' => \$b,
  'c=s' => \$c,   'd=s' => \$d,
);

(比較以外の目的で$a使用することはお勧めできません。)$bsort

于 2010-11-12T10:08:26.943 に答える
0

通常、配列は関数に渡される前に 1 つのリストにフラット化されますが、一部の関数はこの動作をオーバーライドします。これを使用して、オプション グループの配列を定義し、配列のリストを GetOptions に渡すことができます。

use strict;
use warnings;
use Getopt::Long;

my ( $opt_a, $opt_b, $opt_c, $opt_d );

my @opt_group_1 = ( 'a=s' => \$opt_a, 'b=s' => \$opt_b );
my @opt_group_2 = ( 'c=s' => \$opt_c, 'd=s' => \$opt_d );
GetOptions( @opt_group_1, @opt_group_2 );

print "a = $opt_a\nb = $opt_b\nc = $opt_c\nd = $opt_d\n";

これをハッシュに値を格納することと組み合わせて、Zaid が述べたように膨大な数のオプション変数を作成する必要がないようにすることができます。

use strict;
use warnings;
use Getopt::Long;

my @opt_group_1 = ( 'a=s', 'b=s' );
my @opt_group_2 = ( 'c=s', 'd=s' );

my %opt;

GetOptions( \%opt, @opt_group_1, @opt_group_2 );

print "a = $opt{a}\nb = $opt{b}\nc = $opt{c}\nd = $opt{d}\n";
于 2010-11-12T18:46:56.073 に答える