Come posso analizzare una stringa con GetOpt :: Long :: GetOptions?
-
02-07-2019 - |
Domanda
Ho una stringa con possibili argomenti della riga di comando (usando un programma Read-Eval-Print-Loop) e voglio che venga analizzata in modo simile agli argomenti della riga di comando quando passata a Getopt :: Long.
Per elaborare:
Ho una stringa
$str = '--infile /tmp/infile_location --outfile /tmp/outfile'
Voglio che venga analizzato da GetOptions in modo che sia più facile per me aggiungere nuove opzioni.
Una soluzione alternativa che mi viene in mente è quella di dividere la stringa su spazi bianchi e sostituire @ARGV con un nuovo array e quindi chiamare GetOptions. qualcosa come ...
my @arg_arr = split (/\s/, $input_line);
# This is done so that GetOptions reads these new arguments
@ARGV = @arg_arr;
print "ARGV is : @ARGV\n";
GetOptions (
'infile=s' => \$infile,
'outfile=s' => \$outfile
);
C'è un modo buono / migliore?
Soluzione
Dai un'occhiata alla sezione opzioni di analisi da una stringa arbitraria nella man page per Getopt :: Long , I pensa che faccia esattamente quello che stai cercando.
Altri suggerimenti
Invece di dividere su spazi bianchi, usa la funzione glob integrata. Oltre a suddividere su spazi bianchi, ciò farà le espansioni standard della riga di comando, quindi restituirà un elenco. (Ad esempio * darebbe un elenco di file, ecc.) Raccomando anche di localizzare @ARG in linea di principio.
Oltre a questo, è l'unico modo per farlo senza riscrivere GetOptions. (Chiaramente ho bisogno di leggere la documentazione più attentamente.)
Wow !!!
Penso di poter usare le risposte di bentilly e dinomite e fare quanto segue:
- usa glob per eseguire espansioni della riga di comando standard
- passa l'array dopo glob al metodo GetOptionsFromArray del GetOpt :: Long (vedi qui )
Il codice potrebbe assomigliare a ...
GetOptionsFromArray ([glob ($input_line)]);
E questa è solo una riga .. cool (so che devo fare qualche controllo errore ecc.) .. ma è cool ...
Quando si utilizza Getopt :: Long su qualcosa di diverso dall'input dell'utente, tenere presente che alcune funzionalità sono diverse in base alla variabile di ambiente POSIXLY_CORRECT. Puoi ignorarlo con la chiamata appropriata a Configura.
Sembra che i metodi GetOptionsFromArray e GetOptionsFromString siano stati aggiunti solo nella v2.36 e come Murphy direbbe che ho solo la versione 2.35.
Per ora, penso che dovrò vivere con @ARGV locale.