В простом старом 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;
# ...
}