Я использую Getopt Perl:: Длинный модуль для парсинга параметров командной строки. Однако кажется, что это возвращает истинное значение, даже если некоторые аргументы отсутствуют. Существует ли способ сказать, если это верно?
В обычном старом Getopt::Long вы не можете сделать это напрямую - как сказал Джонатан, вам нужно проверить ваши требования на undef. Однако, IMHO, это хорошая вещь - что такое "требуемый" параметр? Часто бывают параметры, которые требуются в одном случае и не требуются в другом -- наиболее распространенным примером здесь является больной палец опции --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
параметр.