Я использую модуль Perl Getopt::Long для анализа аргументов командной строки. Однако кажется, что он возвращает истинное значение, даже если некоторые из аргументов отсутствуют. Есть ли способ сказать, так ли это?Как я могу получить Perl Getopt :: Long, чтобы указать, отсутствуют ли аргументы?
ответ
В простой старой Getopt :: Long, вы не можете сделать это напрямую - как сказал Джонатан, вам нужно проверить свои требования для undef. Однако ИМХО это хорошо - что такое «необходимый» параметр? Часто есть параметры, которые требуются в одном случае, а не в другом - наиболее распространенным примером здесь является больший палец параметра --help
. Это не требуется, и если пользователь использует его, он, вероятно, не знает или не будет передавать какие-либо другие «обязательные» параметры.
Я использую эту идиому в некоторых из моего кода (ну, я привык, пока я не перешел на использование MooseX::Getopt):
use List:MoreUtils 'all';
Getopt::Long::GetOptions(\%options, @opt_spec);
print usage(), exit if $options{help};
die usage() unless all { defined $options{$_} } @required_options;
Даже с MooseX :: Getopt Я не ставлю свои атрибуты required => 1
, опять же из-за опции --help
. Вместо этого я проверяю наличие всех необходимых мне атрибутов, прежде чем переходить в основную часть выполнения программы.
package MyApp::Prog;
use Moose;
with 'MooseX::Getopt';
has foo => (
is => 'ro', isa => 'Str',
documentation => 'Provides the foo for the frobnitz',
);
has bar => (
is => 'ro', isa => 'Int',
documentation => 'Quantity of bar furbles to use when creating the frobnitz',
);
# run just after startup; use to verify system, initialize DB etc.
sub setup
{
my $this = shift;
die "Required option foo!\n" unless $this->foo;
die "Required option bar!\n" unless $this->bar;
# ...
}
Опции являются необязательными, отсюда и название Getopt.
Вы проверяете значения опций, заданные Getopt::Long
; если один из ключевых - «undef
», он был пропущен, и вы можете его идентифицировать.
Возвращаемое значение сообщает вам, что в командной строке не было ужасных ошибок. То, что составляет ошибку, зависит от того, как вы используете Getopt::Long
, но классическим было бы то, что в командной строке содержится -o output
, но команда не распознает опцию -o
.
Иногда варианты не являются необязательными. – tster
@tster: Я согласен; иногда для команды требуется определенная конкретная опция - и было бы неплохо иметь возможность сообщить пакет Getopt, что так. Возможно, некоторые из других пакетов Getopt поддерживают это? Есть много вариантов (и я откатился самостоятельно), но он не поддерживает обязательные аргументы). Есть аргумент о том, что обязательные параметры не должны иметь минус-букву впереди; они становятся позиционными аргументами. Однако, если есть несколько таких аргументов, позиционирование быстро становится трудно запомнить. –
- 1. Getopt :: Declare vs Getopt :: Long
- 2. Perl Getopt :: Long Относящегося Вопрос - Взаимно Эксклюзивные аргументы командной строки
- 3. perl Getopt :: Long output issue
- 4. Perl Getopt :: Long :: Descriptive - как объявить переменные
- 5. Использование флагов Getopt :: Long
- 6. Unknown Опция при использовании Getopt :: Long Perl
- 7. Как Perl's Getopt :: Long обнаруживает аргументы с обязательным параметром?
- 8. Как сгруппировать аргументы при использовании Getopt в Perl?
- 9. C# эквивалентно Perl's Getopt :: Long
- 10. Perl Настройка Вопросы Getopt
- 11. Perl GetOpt :: Длинные множественные аргументы с необязательным параметром
- 12. Обработка исключений и `Getopt :: Long`
- 13. GetOpt Long распознает Verbose
- 14. Perl Getopt :: Long Присвоение переменной затем будет подпрограмму
- 15. Как Cron влияет на модуль Getopt :: Long?
- 16. Возможные аргументы Getopt?
- 17. Могу ли я передать аргументы сортировке сортировки в Perl?
- 18. Perl Getopt :: Long, похоже, не изменяет существующие значения в массиве
- 19. Как я могу преобразовать Long [], чтобы IEnumerable <long?>
- 20. В новой Getopt :: Long Как установить дополнительные значения по умолчанию
- 21. Getopt :: Long :: Descriptive - ошибка в опции spec:
- 22. Как разобрать строку с GetOpt :: Long :: GetOptions?
- 23. Getopt :: Long со специальными параметрами символов (например, -%)
- 24. Как я могу использовать аргументы типа переключателя для подпрограмм в Perl
- 25. «GetOptionsFromString» не экспортирован Getopt :: Long модуль
- 26. Как я могу обработать -r = <pattern> с помощью Getpt Perl :: Long?
- 27. Как я могу получить вложенные аргументы аргументов, чтобы возвращать значения
- 28. Как правильно использовать Getopt :: Long для синтаксического анализа необязательных аргументов?
- 29. Могу ли я явно указать $ 0 перед запуском скрипта Perl?
- 30. Как использовать getopt-long в курице
Большой вопрос. Я хочу, чтобы был способ сделать это, кроме проверки значений для undef. – tster
Понятно, почему это вводит в заблуждение так много людей, как документы для Getopt подразумевают, что вы _can_ указываете необходимые параметры. «Для параметров, которые принимают значения, необходимо указать, требуется ли значение параметра или нет, и какое значение ожидает этот параметр». http://perldoc.perl.org/Getopt/Long.html – lfalin