2010-08-08 2 views
9

Я использую модуль Perl Getopt::Long для анализа аргументов командной строки. Однако кажется, что он возвращает истинное значение, даже если некоторые из аргументов отсутствуют. Есть ли способ сказать, так ли это?Как я могу получить Perl Getopt :: Long, чтобы указать, отсутствуют ли аргументы?

+0

Большой вопрос. Я хочу, чтобы был способ сделать это, кроме проверки значений для undef. – tster

+0

Понятно, почему это вводит в заблуждение так много людей, как документы для Getopt подразумевают, что вы _can_ указываете необходимые параметры. «Для параметров, которые принимают значения, необходимо указать, требуется ли значение параметра или нет, и какое значение ожидает этот параметр». http://perldoc.perl.org/Getopt/Long.html – lfalin

ответ

5

В простой старой 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; 

    # ... 
} 
4

Опции являются необязательными, отсюда и название Getopt.

Вы проверяете значения опций, заданные Getopt::Long; если один из ключевых - «undef», он был пропущен, и вы можете его идентифицировать.

Возвращаемое значение сообщает вам, что в командной строке не было ужасных ошибок. То, что составляет ошибку, зависит от того, как вы используете Getopt::Long, но классическим было бы то, что в командной строке содержится -o output, но команда не распознает опцию -o.

+3

Иногда варианты не являются необязательными. – tster

+0

@tster: Я согласен; иногда для команды требуется определенная конкретная опция - и было бы неплохо иметь возможность сообщить пакет Getopt, что так. Возможно, некоторые из других пакетов Getopt поддерживают это? Есть много вариантов (и я откатился самостоятельно), но он не поддерживает обязательные аргументы). Есть аргумент о том, что обязательные параметры не должны иметь минус-букву впереди; они становятся позиционными аргументами. Однако, если есть несколько таких аргументов, позиционирование быстро становится трудно запомнить. –

Смежные вопросы