Обрабатывать повторяющиеся параметры, такие как -v -vv -vvv, идиоматически с помощью Perl Getopt - PullRequest
2 голосов
/ 02 июня 2019

Я бы хотел обработать опцию уровня детализации, как это делает OpenSSH: путем умножения передачи опции -v.

Getopt::Std не увеличивает значения параметров без аргументов, а просто устанавливает их на 1. Это означает, что передача -vvv с Getopt :: Std даст $opt_v == 1, и мне нужно, чтобы в этом случае оно было 3.

Getopt::Long с опцией-спецификацией v+ правильно понимает -v -v (целевая переменная заканчивается 2), но она неправильно понимает -vvv как параметр с именем vvv - который не определен и вызывает ошибка.

Как я могу получить желаемое поведение?

1 Ответ

3 голосов
/ 02 июня 2019

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


Лучший способ справиться с этим - использовать Getopt::Long с bundling:

use Getopt::Long qw(:config bundling);
GetOptions ("v+" => \$verbose);

Это обрабатывает -v -vv -vvv, как и ожидалось: $verbose == 6.


Если по какой-то причине вы не можете использовать или предпочитаете не использовать bundling, единственным другим способом является определение параметров vv, vvv и т. Д. До разумного максимума:

use Getopt::Long;
GetOptions (
    "v+" => \$verbose);
    "vv" => sub { $verbose += 2 },
    "vvv" => sub { $verbose += 3 },
);

Это также обрабатывает -v -vv -vvv, как и ожидалось: $verbose == 6.

...