2017-07-24 4 views
1

J'ai un script perl qui devrait analyser les éléments suivants:Comment détecter la valeur d'option non valide

prog -t -p xyz "ab" -cm xyz.cmd -co xyz.config

Mais Je veux à l'erreur quand j'entre

prog t xyz -pab -cm xyz.cmd -co xyz.config

(Parce que -p est suivie a et b sans les guillemets). J'utilise Getopt :: Long pour traiter les arguments de la ligne cmd. Comment puis-je attraper la situation et l'erreur ci-dessus?

Merci!

+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

+0

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

Répondre

7

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); 
} 
+0

@ysth Je pense que 'require_order' n'est pas pertinent pour ce problème. – melpomene

+0

@melpomene, Ce n'est pas obligatoire, bien qu'il arrête d'analyser plus tôt avec lui. J'utilise toujours 'posix_default'. (Pourquoi voudriez-vous que votre nouveau programme soit non-standard?) – ikegami

+0

@ikegami Parce qu'aucun des autres programmes sur ma machine (utilitaires GNU) ne suit des règles POSIX strictes. – melpomene