Wie analysieren ich eine Zeichenfolge mit getopt :: Long :: GetOptions?
-
02-07-2019 - |
Frage
Ich habe eine Zeichenfolge mit möglichen Kommandozeilenparameter (unter Verwendung eines Read-Eval-Print-Loop-Programm) und ich möchte es auf die Befehlszeilenargumente analysiert ähnlich werden, wenn auf getopt weitergegeben :: Long.
Um dies näher auszuführen:
Ich habe eine Zeichenfolge
$str = '--infile /tmp/infile_location --outfile /tmp/outfile'
Ich mag es von GetOptions analysiert werden, so dass es einfacher für mich ist es, neue Optionen hinzuzufügen.
Eine Abhilfe, die ich denken konnte, ist die Zeichenfolge auf Leerzeichen zu spalten und @ARGV mit neuen Array ersetzen und dann GetOptions nennen. so etwas wie ...
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?
Lösung
Überprüfen Sie den Abschnitt Parsen Optionen aus eine beliebige Zeichenfolge in der noreferrer"> Manpage rel="nofollow , ich denke, es tut genau das, was Sie suchen.
Andere Tipps
Statt der Aufteilung auf Leerzeichen, verwenden Sie die eingebaute in glob-Funktion. Zusätzlich zu Leerzeichen zu Splitting, die die Standard-Befehlszeilenerweiterungen tun, dann wieder eine Liste. (Zum Beispiel * würde eine Liste von Dateien geben, etc.) ich auch lokale llen @ARG auf allgemeines Prinzip empfehlen würde.
Other than that, das ist der einzige Weg, es ohne Umschreiben GetOptions tun können. (klar Ich brauche die Dokumentation mehr sorgfältig zu lesen.)
Wow !!!
Ich glaube, ich bentilly und dinomite die beide Antworten verwenden können und wie folgt vor:
- Verwendung glob Standard-Befehlszeile Erweiterungen auszuführen
- übergeben Sie das Array nach glob zu GetOptionsFromArray Methode der getopt :: Long (siehe hier )
-Code kann etwas aussehen ...
GetOptionsFromArray ([glob ($input_line)]);
Und das ist nur eine Zeile .. cool (ich weiß, ich habe einige Fehler zu tun Überprüfung usw.) .. aber sein kühle ...
Wenn Sie Getopt verwenden :: Long auf etwas anderes als eine Benutzereingabe, beachten Sie, dass einige Funktionen unterschiedlich sind auf der Grundlage der POSIXLY_CORRECT Umgebungsvariable. Sie können mit dem entsprechenden Anruf außer Kraft setzen, dies zu konfigurieren.
Es scheint, wie die Methoden GetOptionsFromArray und GetOptionsFromString nur in v2.36 hinzugefügt wurden und wie Murphy sagen würde, ich habe Version 2.35 nur.
Im Moment denke ich, ich werde mit den lokalen @ARGV leben müssen.