2016-09-07 1 views
3

Existe-t-il un moyen de forcer l'utilisation de -flags lors de la lecture d'arguments de ligne de commande à l'aide de Getopt :: Long? Par exemple, dans ma situation actuelle:Utilisation forcée des drapeaux Getopt :: Long

GetOptions('r=s' => \$var1, 
       'lf=f' => \$var2, 
       'uf=f' => \$var3, 
       'trd=i' => \$var4, 
       'vd=f' => \$var5) 
or die("$usage"); 

Le script ne quitte pas ou afficher l'utilisation de $ si les arguments sont encore fournis, mais sans les drapeaux (comme -lf). Au lieu de cela, il fonctionne indépendamment jusqu'à ce qu'il soit inévitablement des erreurs plus tard car les arguments n'ont pas été lus dans leurs variables respectives (et pourraient bien être dans le mauvais ordre).

+0

On ne sait pas ce que vous entendez par "drapeaux". Si vous exécutez votre code ci-dessus avec seulement '-lf' en option, alors' GetOptions' retournera un statut d'erreur. Voulez-vous dire que vous voulez que certaines des options soient obligatoires? – Borodin

+0

@Borodin Par drapeaux, je veux dire -lf, -uf, -trd et -vd. Je peux lancer le script sans faux résultat avec: script.pl arg1 arg2 arg3 arg4. Je m'attendais à ce que cela ne fonctionne pas car ceci n'était pas fourni: script.pl -lf arg1 -uf arg2 -trd arg3 -vd arg4. – AnnaSchumann

Répondre

4

Q: GetOptions ne retourne pas un faux résultat lorsqu'une option est non fourni

A: C'est la raison pour laquelle on les appelle des 'options'.

Source: Getopt::Long documentation

Vous pouvez ajouter de vérifier la valeur conditionals des drapeaux et si elles ne sont pas définis alors appeler die ou appelez usage.

1

Getopt::Long recherchera toutes les options de ligne de commande que vous avez spécifiées dans l'appel GetOptions. Aucun d'entre eux sont nécessaires, mais une option individuelle peut être nécessaire d'avoir une valeur d'un type spécifique, et GetOptions retournera un faux état si une valeur est manquante ou a le mauvais type

Toutes les options et leurs valeurs sont supprimés de la ligne de commande, et tout ce qui reste est passé au programme par @ARGV comme d'habitude

La plupart des programmes ne nécessitent pas toutes les options possibles à fournir sur la ligne de commande, donc si vous voulez insister que tous sont spécifiés, vous pouvez simplement les tester avec

use List::Util 'all'; 

die $usage unless all { defined } $var1, $var2, $var3, $var4, $var5; 

Vous pouvez également exiger qu'il n'y a pas d'entrée qui n'est spécifié comme l'une des options, dans ce cas, vous pouvez vérifier simplement @ARGV

die $usage if @ARGV; 
0

Il suffit de cocher la suite.

use File::Basename qw(basename); 

sub help { 
    print(...); 
    exit(0); 
} 

sub usage { 
    if (@_) { 
     my ($msg) = @_; 
     chomp($msg); 
     warn("$msg\n"); 
    } 

    my $prog_name = basename($0); 

    warn("Use $prog_name --help for more information\n"); 
    exit(1); 
} 

my ($var1, $var2, $var3, $var4, $var5); 

GetOptions(
    'help|h|?' => \&help, 
    'r=s'  => \$var1, 
    'lf=f'  => \$var2, 
    'uf=f'  => \$var3, 
    'trd=i' => \$var4, 
    'vd=f'  => \$var5 
) 
    or usage(); 

defined($var2) 
    or usage("-lf must be provided");