2008-09-22 10 views
7

Ich habe eine Zeichenfolge mit möglichen Befehlszeilenargumente (mit einem Read-Eval-Print-Loop-Programm) und ich möchte es ähnlich wie die Befehlszeilenargumente analysiert werden, wenn Getopt :: Long übergeben.Wie analysiere ich eine Zeichenfolge mit GetOpt :: Long :: GetOptions?

Um dies näher auszuführen:

ich eine Zeichenfolge haben

$str = '--infile /tmp/infile_location --outfile /tmp/outfile' 

Ich möchte es von GetOptions analysiert werden, so dass es einfacher für mich ist es, neue Optionen hinzuzufügen.

Eine Problemumgehung, die ich mir vorstellen könnte, ist die Zeichenfolge in Whitespace aufzuteilen und @ARGV durch ein neues Array zu ersetzen und dann GetOptions aufzurufen. wie etwas ...

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 
      ); 

Gibt es einen guten/besseren Weg?

Antwort

7

Verwenden Sie die integrierte Glob-Funktion anstelle von Leerzeichen. Zusätzlich zur Aufteilung in Whitespaces führt das die Standard-Befehlszeilenerweiterungen durch und gibt dann eine Liste zurück. (Zum Beispiel würde * eine Liste von Dateien usw. geben.) Ich würde auch empfehlen, @ARG nach dem allgemeinen Prinzip zu lokalisieren.

Ansonsten ist dies die einzige Möglichkeit, ohne GetOptions neu zu schreiben. (klar Ich brauche die Dokumentation mehr sorgfältig zu lesen.)

5

Wow !!!

Ich glaube, ich bentilly und dinomite die beide Antworten verwenden können und wie folgt vorgehen:

  • Verwendung glob Standard-Befehlszeile auszuführen Erweiterungen
  • das Array nach glob zu GetOptionsFromArray Methode des getopt passieren :: Long (siehe here)

-Code etwas aussehen kann ...

GetOptionsFromArray ([glob ($input_line)]); 

Und das ist nur eine Zeile .. cool (Ich weiß, ich muss einige Fehlerprüfung usw.) .. aber es ist cool ...

+0

Das erste Argument ist eine Array-Referenz, Sie wollen also "GetOptionsFromArray ([glob ($ input_line)], ...)" –

+0

Danke Michael .. Hier geht die Änderung im Code ... – Jagmal

0

Wenn Sie Getopt :: Long auf etwas anderes als Benutzereingabe verwenden, Beachten Sie, dass einige Funktionen basierend auf der Umgebungsvariable POSIXLY_CORRECT unterschiedlich sind. Sie können dies mit dem entsprechenden Aufruf von Konfigurieren überschreiben.

Obligatory POSIXLY_CORRECT anecdote.

0

Es scheint wie die Methoden GetOptionsFromArray und GetOptionsFromString wurden nur in v2.36 hinzugefügt und Murphy würde sagen, ich habe nur Version 2.35.

Für jetzt denke ich, ich muss mit lokalen @ ARGV leben.

Verwandte Themen