Può Getopt di Perl :: Long analizzare argomenti Non mi definisco prima del tempo?
-
22-08-2019 - |
Domanda
Io so come usare Perl Getopt :: Long, ma non sono sicuro di come posso configurarlo per accettare qualsiasi "--key = valore" coppia che non è stato esplicitamente definito e incollarla in un hash. In altre parole, non so in anticipo ciò che le opzioni che l'utente può decidere, quindi non c'è modo per me per definire tutti loro, ma voglio essere in grado di analizzare tutti.
Suggerimenti? Grazie in anticipo.
Soluzione
Il href="http://search.cpan.org/perldoc?Getopt::Long" rel="nofollow noreferrer"> Una volta che le opzioni regolari vengono analizzati, è possibile utilizzare il codice come quella fornito da RunRig per analizzare le opzioni ad hoc. Getopt::Long
documentazione
pass_through (default: disabled)
Options that are unknown, ambiguous or supplied
with an invalid option value are passed through
in @ARGV instead of being flagged as errors.
This makes it possible to write wrapper scripts
that process only part of the user supplied
command line arguments, and pass the remaining
options to some other program.
Altri suggerimenti
Getopt :: Long non lo fa. È possibile analizzare le opzioni di se stessi ... per esempio.
my %opt;
my @OPTS = @ARGV;
for ( @OPTS ) {
if ( /^--(\w+)=(\w+)$/ ) {
$opt{$1} = $2;
shift @ARGV;
} elsif ( /^--$/ ) {
shift @ARGV;
last;
}
}
o modificare Getopt :: Long gestirlo (o modificare il codice di cui sopra per gestire più tipi di opzioni, se avete bisogno di questo).
Sono un po 'parziale, ma ho usato Getopt :: Qualunque sia nel passato per analizzare argomenti sconosciuti.
Potenzialmente, si potrebbe usare il " Opzioni con valori hash " caratteristica.
Per esempio, ho voluto consentire agli utenti di impostare filtri arbitrari quando analizza attraverso una matrice di oggetti.
GetOptions(my $options = {}, 'foo=s', 'filter=s%')
my $filters = $options->{filter};
E poi chiamare come
perl ./script.pl --foo bar --filter baz=qux --filter hail=eris
Il che avrebbe costruito qualcosa di simile ..
$options = {
'filter' => {
'hail' => 'eris',
'baz' => 'qux'
},
'foo' => 'bar'
};
E naturalmente $ filtri avranno il valore associato al 'filtro'
In bocca al lupo! Spero che qualcuno ha trovato questa utile.
Argomento Richiamata
Un'opzione
<>
'nome' speciale può essere utilizzato per designare una subroutine per gestire gli argomenti non di opzione. QuandoGetOptions()
incontra un argomento che non sembra un'opzione, immediatamente chiamare questa subroutine e lo passa un parametro: il nome dell'argomento.Beh, in realtà è un oggetto che stringifies al nome dell'argomento.
Per esempio:
my $width = 80; sub process { ... } GetOptions ('width=i' => \$width, '<>' => \&process);Quando viene applicato il seguente comando:
arg1 --width=72 arg2 --width=60 arg3Ciò richiederà
process("arg1")
mentre$width
è 80, mentreprocess("arg2")
$width
è 72, eprocess("arg3")
mentre$width
è 60.Questa funzionalità richiede configurazione delle opzioni permute, vedere la sezione "Configurazione Getopt :: Long".
Questo è un buon momento per rotolare il proprio parser opzione. Nessuno dei moduli che ho visto sul CPAN fornire questo tipo di funzionalità, e si poteva sempre guardare le loro implementazioni per ottenere un buon senso di come gestire i dadi e bulloni di parsing.
Per inciso, questo tipo di codice mi fa odio Getopt varianti:
use Getopt::Long;
&GetOptions(
'name' => \$value
);
La capitalizzazione incoerente è esasperante, anche per le persone che hanno visto e usato questo stile di codice per un lungo periodo di tempo.