2010-08-08 2 views
9

J'utilise le module Getopt::Long de Perl pour analyser les arguments de la ligne de commande. Cependant, il semble qu'il renvoie une valeur vraie même si certains des arguments sont manquants. Est-il possible de dire si c'est le cas?Comment puis-je obtenir Getopt :: Long de Perl pour savoir si les arguments sont manquants?

+0

Bonne question. Je souhaite qu'il y avait un moyen de faire cela autre que de vérifier les valeurs pour undef. – tster

+0

Il est compréhensible que cela soit déroutant pour tant de gens, car les documents pour Getopt impliquent que vous pouvez spécifier les options requises. "Pour les options prenant des valeurs, il faut spécifier si la valeur de l'option est requise ou non, et quel type de valeur attend l'option." http://perldoc.perl.org/Getopt/Long.html – lfalin

Répondre

5

Dans l'ancienne version de Getopt :: Long, vous ne pouvez pas le faire directement - comme l'a dit Jonathan, vous devez vérifier vos besoins pour undef. Cependant, à mon humble avis ceci est une bonne chose - qu'est-ce qu'un paramètre "requis"? Souvent, on a des paramètres qui sont requis dans un cas et pas un autre - l'exemple le plus courant étant le pouce endolori de l'option --help. Ce n'est pas obligatoire, et si l'utilisateur l'utilise, il ne sait probablement pas ou ne passera aucun des autres paramètres "requis".

J'utilise cet idiome dans une partie de mon code (bien, je faisais, jusqu'à ce que je suis passé à l'aide 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; 

Même avec MooseX :: Getopt Je ne mets pas mes attributs à required => 1 , encore une fois à cause de l'option --help. Au lieu de cela, je vérifie la présence de tous les attributs dont j'ai besoin avant de passer au corps principal de l'exécution du programme.

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

Les options sont facultatives, d'où le nom 'Getopt'.

Vous vérifiez les valeurs d'option définies par Getopt::Long; Si l'un des plus importants est 'undef', il a été manqué et vous pouvez l'identifier.

La valeur de retour vous indique qu'il n'y a pas eu de gaffes horribles dans la ligne de commande. Qu'est-ce qui constitue une erreur dépend de la façon dont vous utilisez Getopt::Long, mais un classique serait que la ligne de commande contient -o output mais la commande ne reconnaît pas une option -o.

+3

Parfois, les options ne sont pas facultatives. – tster

+0

@tster: Je suis d'accord; parfois, une commande nécessite une option spécifique pour apparaître - et il serait bon d'être en mesure d'informer le paquet Getopt que tel est le cas. Peut-être que certains des autres paquets de Getopt supportent cela? Il y a beaucoup de choix (et j'ai roulé le mien - mais il ne supporte pas les arguments obligatoires). Il y a un argument selon lequel les options obligatoires ne devraient pas avoir besoin d'une lettre moins; ils deviennent des arguments positionnels. Cependant, s'il existe plusieurs arguments de ce type, la position devient rapidement difficile à retenir. –

Questions connexes