Vous pouvez simplement vérifier s'il ne vous reste plus d'options.
use Getopt::Long qw();
my ($opt_t, $opt_p, $opt_cm, $opt_co);
sub parse_args {
Getopt::Long::Configure(qw(posix_default));
($opt_t, $opt_p, $opt_cm, $opt_co) =();
Getopt::Long::GetOptions(
'h|help|?' => \&help,
't=s' => \$opt_t,
'p=s' => \$opt_p,
'cm=s' => \$opt_cm,
'co=s' => \$opt_co,
)
or usage();
@ARGV == 0
or usage("Too many arguments.");
}
{
parse_args();
...
}
sortie (en utilisant le usage
fourni ci-dessous):
$ ./prog -t xyz -p a b -cm xyz.cmd -co xyz.config
Too many arguments.
Try `prog --help' for more information.
En aparté, des recommandations pour la mise en œuvre de help
et usage
:
use File::Basename qw(basename);
sub help {
my $prog = basename($0);
print("$prog [options]\n");
print("$prog --help\n");
print("\n");
print("Options:\n");
...
exit(0);
}
sub usage {
my $prog = basename($0);
if (my ($msg) = @_) {
chomp($msg);
warn("$msg\n");
}
warn("Try `$prog --help' for more information.\n");
exit(1);
}
Dans votre deuxième utilisation cas, 'b' serait traité comme un argument de ligne de commande normal et persisterait dans' @ARGV ', il suffit donc de vérifier que' @ ARGV' n'a qu'un seul élément? – mob
Si l'on s'attend à ce que 'a' ou' b' soit autre chose que des chaînes, vous pouvez utiliser un entier (ou float) intput pour '-p'. En dehors de cela, vous aurez un 'b' lâche dans' @ ARGV' après 'Getopt :: Long' est fait avec sa partie, vous pouvez le vérifier. Ou juste analyser et vérifier l'entrée '-p'. – zdim