Как я могу получить доступ к значению опции Getopt :: Long в подпункте опции? - PullRequest
5 голосов
/ 12 марта 2011

Моя цель - иметь опцию --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] содержит значение.Магия.

Я не видел этого документированного, поэтому меня беспокоит, невольно ли я делаю какие-либо ошибки, используя эту технику.

1 Ответ

8 голосов
/ 12 марта 2011

Из тонкой инструкции :

Когда GetOptions () встречает параметр, он вызывает подпрограмму с двумя или тремя аргументами. Первый аргумент - это имя опции. (На самом деле, это объект, который переводится в строку с именем опции.) Для скалярного или массивного назначения вторым аргументом является значение, которое нужно сохранить. Для пункта назначения хэша вторым аргументом является ключ хэша, а третьим аргументом - значение, которое будет сохранено.

Итак, поведение, которое вы видите, задокументировано, и вы должны быть в безопасности с ним.

...