Può Getopt di Perl :: Long analizzare argomenti Non mi definisco prima del tempo?

StackOverflow https://stackoverflow.com/questions/529868

  •  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.

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.

documentazione :

Argomento Richiamata

Un'opzione <> 'nome' speciale può essere utilizzato per designare una subroutine per gestire gli argomenti non di opzione. Quando GetOptions() 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 arg3

Ciò richiederà process("arg1") mentre $width è 80, mentre process("arg2") $width è 72, e process("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.

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