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?

È stato utile?

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.

Aneddoto obbligatorio POSIXLY_CORRECT .

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top