Моя цель - иметь опцию --override=f
, которая манипулирует значениями двух других опций.Хитрость заключается в том, чтобы выяснить, как обращаться к значению опции (части, совпадающей с f
в обозначении =f
) в sub
, которое выполняется, когда GetOptions обнаруживает наличие параметра в командной строке.
Вот как я это делаю:
$ 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]
содержит значение.Магия.
Я не видел этого документированного, поэтому меня беспокоит, невольно ли я делаю какие-либо ошибки, используя эту технику.