Как я могу получить Perl Getopt :: Long, чтобы сказать, если аргументы отсутствуют? - PullRequest
9 голосов
/ 08 августа 2010

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

Ответы [ 2 ]

5 голосов
/ 08 августа 2010

В простом старом 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 голосов
/ 08 августа 2010

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

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

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

...