2010-03-16 2 views
2

J'examine les options de ligne de commande en Perl en utilisant Getopt::Long. Je suis obligé d'utiliser le préfixe - (un tiret) pour les commandes courtes (-s) et -- (double tiret) pour les commandes longues (par exemple, --input=file).Comment puis-je gérer -r = <pattern> avec Perop's Getopt :: Long?

Mon problème est qu'il ya une option spéciale (-r=<pattern>) il est donc option longue pour son exigence d'argument, mais il doit avoir un tiret (-) préfixe non double tiret (--) comme d'autres options longues. Est-il possible de configurer Getopt::Long pour les accepter?

+4

Ouch. Il ne peut vraiment pas être changé en '-r arg' ou' --r = arg' ou quoi que ce soit à ce stade? Non seulement cela fait-il travailler pour vous, mais cela semble déroutant pour l'utilisateur d'avoir une option qui brise la convention habituelle. – Cascabel

+0

P.S. Je n'essaie pas d'éviter de te donner une réponse - je sais que tu es probablement déjà au courant de ce que j'ai dit. (Aussi je ne pense pas qu'il y ait une réponse dans Getopt :: Long) – Cascabel

+4

L'astuce consiste à faire ressembler les arguments à ce que les gens attendent d'autres programmes. C'est quand vous voulez une nouvelle syntaxe que les choses deviennent bizarres et vous devez faire beaucoup de travail pour les analyser. –

Répondre

3

Etes-vous en train de configurer le "regroupement"?

Si tel est le cas, vous pouvez désactiver le regroupement (mais vous ne pourrez pas faire certaines choses comme utiliser myprog -abc au lieu de myprog -a -b -c).

Sinon, la seule chose qui vous vient à l'esprit est d'utiliser Argument Callback (<>) et d'analyser manuellement cette option.

6

Par défaut, Getopt::Long accepte indifféremment un tiret simple (-) ou un tiret double (-). Donc, vous pouvez simplement utiliser --r=foo. Avez-vous une erreur lorsque vous essayez cela?

use strict; 
use warnings; 
use Getopt::Long; 
my $input = 2; 
my $s = 0; 
my $r = 3; 
GetOptions(
    'input=s' => \$input, 
    's'  => \$s, 
    'r=s'  => \$r, 
); 
print "input=$input\n"; 
print "s=$s\n"; 
print "r=$r\n"; 

Ces lignes de commande échantillons produisent les mêmes résultats:

my_program.pl --r=5 
my_program.pl --r 5 
my_program.pl -r=5 
my_program.pl -r 5 

input=2 
s=0 
r=5 
0
#!/usr/bin/perl 

use strict; use warnings; 

use Getopt::Long; 

my $pattern; 

GetOptions('r=s' => \$pattern); 

print $pattern, "\n"; 

Sortie:

C:\Temp> zz -r=/test/ 
/test/ 
C:\Temp> zz -r /test/ 
/test/

Est-ce que je manque quelque chose?

+3

Je pense que ce qu'il décrit pourrait être dû au fait que le groupement soit activé? – DVK

+0

@DVK C'est probablement le cas. Je n'avais pas pensé à cela. –

Questions connexes