5

私の目標は、--override=f他の 2 つのオプションの値を操作するオプションを持つことです。コツは、GetOptions がコマンド ラインでオプションの存在を検出したときに実行されるで、オプションの値 (指定子の に一致する部分)fを参照する方法を考え出すことです。=fsub

これが私がやっている方法です:

$ cat t.pl
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
our %Opt = (
    a   => 0,
    b   => 0,
);
our %Options = (
    "a=f"       => \$Opt{a},
    "b=f"       => \$Opt{b},
    "override=f"    => sub { $Opt{$_} = $_[1] for qw(a b); },  # $_[1] is the "trick"
);
GetOptions(%Options) or die "whatever";
print "\$Opt{$_}='$Opt{$_}'\n" for keys %Opt;

$ t.pl --override=5
$Opt{a}='5'
$Opt{b}='5'

$ t.pl --a=1 --b=2 --override=5 --a=3
$Opt{a}='3'
$Opt{b}='5'

コードは、私が望むようにオプションとオーバーライドを処理するようです。sub内に、$_[0]オプションの名前(コマンドラインで省略されている場合でも完全な名前)が含まれ、値が含まれていることを発見しました$_[1]。魔法。

これが文書化されているのを見たことがないので、この手法を使用して無意識のうちに間違いを犯していないか心配です.

4

1 に答える 1

8

細かいマニュアルから:

GetOptions() がオプションに遭遇すると、2 つまたは 3 つの引数を指定してサブルーチンを呼び出します。最初の引数はオプションの名前です。(実際には、これはオプションの名前に文字列化されるオブジェクトです。) スカラーまたは配列の宛先の場合、2 番目の引数は格納される値です。ハッシュ宛先の場合、2 番目の引数はハッシュのキーであり、3 番目の引数は格納される値です。

そのため、表示されている動作は文書化されており、安全に使用できるはずです。

于 2011-03-12T07:29:27.377 に答える