2010-06-08 23 views
17

Si j'ai une ligne de commande comme:Comment puis-je permettre à des options non définies lors de l'analyse args avec Getopt

my_script.pl -foo -WHATEVER 

Mon script connaît --foo, et je veux Getopt à définir la variable $opt_foo, mais je ne sais pas quoi que ce soit sur -WHATEVER. Comment puis-je demander à Getopt d'analyser les options dont je viens de parler, puis d'obtenir le reste des arguments dans une variable chaîne ou une liste?

Un exemple:

use strict; 
use warnings; 

use Getopt::Long; 

my $foo; 

GetOptions('foo' => \$foo); 

print 'remaining options: ', @ARGV; 

Ensuite, l'émission

perl getopttest.pl -foo -WHATEVER

donne

 
Unknown option: whatever 
remaining options: 

Répondre

20

Vous devez configurer « pass_through option » via Getopt::Long::Configure("pass_through");

Ensuite, il prend en charge les options réelles (par exemple des choses en commençant par « - » et sans spécial « - » delimiter pour signifier la fin des options « réelles ») .

est ici citation perldoc:

  • pass_through (désactivé par défaut)

    options qui sont inconnues, ambiguës ou fourni avec une valeur d'option non valide sont passés à travers en @ARGV au lieu d'être marqué comme les erreurs. Cela permet d'écrire des scripts wrapper qui ne traitent qu'une partie des arguments de ligne de commande fournis par l'utilisateur et de passer les options restantes à un autre programme.

Voici un exemple

$ cat my_script.pl 
#!/usr/local/bin/perl5.8 -w 

use Getopt::Long; 
Getopt::Long::Configure("pass_through"); 
use Data::Dumper; 
my %args; 
GetOptions(\%args, "foo") or die "GetOption returned 0\n"; 
print Data::Dumper->Dump([\@ARGV],["ARGV"]); 

$ ./my_script.pl -foo -WHATEVER   
$ARGV = [ 
      '-WHATEVER' 
     ]; 
+1

Un ha, ce qui expliquerait pourquoi je ne l'ai pas trouvé ... :) – Ether

+4

Je trouve absolument exaspérant de lire sur une option soignée sur le site Web de perldoc, puis de revenir à mon installation Perl entreprise mésosée et de trouver que l'option exacte parfaite J'ai trouvé nécessaire un condensateur de flux, ou au moins une mise à niveau du module CPAN – DVK

+1

Êtes-vous sûr que 'pass_through' n'est pas disponible avec 5.8? Je viens de vérifier 'perldoc Getopt :: Long' pour 5.6.1 (et vous pensiez que vous étiez pré-historique;)) et c'est là. – Zaid

1

ne sont pas les valeurs restantes (non analysées) simplement laissés dans @ARGV? Si votre contenu supplémentaire commence par des tirets, vous devez indiquer la fin de la liste des options avec un --:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Getopt::Long; 
use Data::Dumper; 

my $foo; 
my $result = GetOptions ("foo" => \$foo); 
print Dumper([ $foo, \@ARGV ]); 

appeler ensuite:

my_script.pl --foo -- --WHATEVER 

donne:

$VAR1 = [ 
      1, 
      [ 
      '--WHATEVER' 
      ] 
     ]; 

PS . Dans MooseX::Getopt, les options "restantes" de la ligne de commande sont placées dans l'attribut extra_argv en tant que arrayref - donc je vous recommande de convertir!

+0

Ils ne sont pas si elles ressemblent à des options. Au lieu de cela, une erreur comme "Option inconnue: WHATEVER" sera envoyée à STDERR. –

+0

@Robert: votre commentaire et mon montage croisés dans l'éther :) – Ether

+0

:] En effet! Haha, j'ai ajouté un exemple comme ça à la question, aussi. –

0

Je pense que la réponse ici, malheureusement, est "non, il n'y a pas moyen de le faire exactement comme vous le demandez, en utilisant Getopt :: Long, sans analyser @ARGV par vous-même." Ether a une solution de contournement décente, cependant. C'est une caractéristique dans la mesure où la plupart des gens sont préoccupés par le fait que tout argument semblable à une option est capturé comme une erreur. Normalement, vous pouvez faire

GetOptions('foo' => \$foo) 
    or die "Whups, got options we don't recognize!"; 

pour capturer/empêcher les options bizarres d'être passé, et vous pouvez corriger l'utilisateur sur l'utilisation. Alternativement, vous pouvez simplement passer à travers et les ignorer.