2010-06-08 6 views
17

Se ho una linea di comando come:Come posso permettere opzioni non definite durante l'analisi di argomenti con Getopt

my_script.pl -foo -WHATEVER 

Il mio script sa di --foo, e voglio Getopt per impostare variabile $opt_foo, ma non so nulla su -WHATEVER. Come posso dire a Getopt di analizzare le opzioni di cui ho parlato e quindi ottenere il resto degli argomenti in una variabile stringa o in un elenco?

Un esempio:

use strict; 
use warnings; 

use Getopt::Long; 

my $foo; 

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

print 'remaining options: ', @ARGV; 

Poi, l'emissione di

perl getopttest.pl -foo -WHATEVER

 
Unknown option: whatever 
remaining options: 

risposta

20

è necessario configurare "pass_through" opzione tramite Getopt::Long::Configure("pass_through");

Poi supporta opzioni reali (ad esempio, roba che inizia con "-" e senza la speciale "-" delimitatore per indicare la fine delle opzioni "reali") .

Ecco perldoc citazione:

  • pass_through (default: disabilitato)

    opzioni che sono sconosciuti, ambigui o fornito con un valore di opzione non valida sono passati attraverso @ARGV invece di essere contrassegnato come errori. Ciò rende possibile scrivere script di wrapper che elaborano solo una parte degli argomenti della riga di comando forniti dall'utente e passare le altre opzioni a qualche altro programma.

Ecco un esempio

$ 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

A ha, questo spiegherebbe perché non l'ho trovato ... :) – Ether

+4

Trovo assolutamente irritante leggere su qualche opzione accurata sul sito perldoc e poi tornare alla mia installazione Perl aziendale mesosoic e trovare l'opzione perfetta perfetta Ho trovato che richiede un condensatore di flusso, o almeno un aggiornamento del modulo CPAN – DVK

+1

Sei sicuro che 'pass_through' non è disponibile con 5.8? Ho appena controllato 'perldoc Getopt :: Long' per 5.6.1 (e pensavate di essere preistorici;)) ed è lì. – Zaid

1

non sono i valori rimanenti (non analizzate) semplicemente lasciato in @ARGV? Se il contenuto aggiuntivo inizia con i trattini, è necessario indicare la fine della lista di opzioni con 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 ]); 

quindi chiamando:

my_script.pl --foo -- --WHATEVER 

dà:

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

PS . In MooseX::Getopt, le opzioni "rimanenti" dalla riga di comando vengono inserite nell'attributo extra_argv come arrayref, quindi ti consigliamo di effettuare la conversione!

+0

Essi non sono se sembrano opzioni. Invece, un errore come "Opzione sconosciuta: WHATEVER" sarà rilasciato a STDERR. –

+0

@Robert: il tuo commento e la mia modifica incrociati nell'etere :) – Ether

+0

:] Effettivamente! Haha, ho aggiunto un esempio simile anche alla domanda. –

0

Penso che la risposta qui, purtroppo, sia "no, non esiste un modo per farlo esattamente come chiedi, usando Getopt :: Long, senza analizzare @ARGV da solo". Ether ha una soluzione decente, però. È una caratteristica per la maggior parte delle persone preoccupata che qualsiasi argomento tipo-opzione venga catturato come un errore. Normalmente, si può fare

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

per catturare/prevenire opzioni dispari da essere passato, e quindi è possibile correggere l'utente all'utilizzo. In alternativa, puoi semplicemente passare e ignorarli.

Problemi correlati