Geschichte der Frage:
Seit den frühesten Perl-Versionen stellte die Variable @ARGV eine Liste von Befehlszeilenargumenten bereit. Allerdings führte das manuelle Parsen leicht zu Fehlern. Um die Lesbarkeit und Flexibilität zu verbessern, wurde das Modul Getopt::Std eingeführt, später Getopt::Long und externe CPAN-Module (z.B. MooX::Options, Getopt::Euclid).
Problem:
Das „manuelle“ Parsen berücksichtigt oft keine negativen Zahlen, obligatorischen und mehrfachen Flags, Parameter mit Leerzeichen. Verschiedene Syntaxformate (--flag=value, -abc, gemischte Positionen) können das Skript unfreundlich und anfällig für Fehler bei der Änderung der Argumentenreihenfolge machen.
Lösung:
Verwenden Sie Getopt::Long für das fortgeschrittene Parsen von Optionen und Flags. Es unterstützt lange/kürzere Optionen, automatisches Erkennen von Variationen, Arrays, Hashes und verschiedene Flagformate. Für sehr komplexe CLI-Oberflächen werden CPAN-Module mit deklarativer Beschreibung von Parametern verwendet (MooX::Options, MooseX::Getopt).
Beispielcode:
use Getopt::Long; my $verbose = 0; my $count = 0; my @files; GetOptions( "verbose" => \$verbose, "count=i" => \$count, "file=s" => \@files, ); print "Verbose is $verbose Count is $count Files: @files ";
Wichtige Merkmale:
Wie unterscheidet man positionale Argumente von optionalen, wenn nur Getopt::Std verwendet wird?
Getopt::Std kann nicht mit langen benannten Optionen arbeiten oder positionale Argumente automatisch trennen. Nach dem Parsen der kurzen Flags sind positionale Argumente in @ARGV verfügbar, aber die Unterstützung für komplexe Syntax erfordert manuelle Arbeit.
Was ist der Hauptunterschied zwischen Getopt::Long und Getopt::Std?
Getopt::Std arbeitet nur mit kurzen (einzelnen) Optionen, während Getopt::Long lange Flags, Werttypen, Arrays/Hashes parsen kann und keine alphabetischen Schlüssel unterstützt.
Kann man Parameter über STDIN annehmen und nicht nur über @ARGV?
Ja, aber das ist nicht der Standard für Getopt::Long. Für gemischte CLI- und STDIN-Eingaben müssen Sie STDIN manuell lesen und diese Eingabe in Ihre Parsing-Logik integrieren.
Ein Skript parst manuell jedes Argument aus @ARGV durch eine Schleife und vergisst die Werte nach --arg, die Bearbeitung mit -- und die fehlerhafte Verarbeitung negativer Zahlen (z.B. wird -5 zu einem Flag).
Vorteile:
Nachteile:
Verwendung von Getopt::Long mit einer kurzen Beschreibung aller Variablen zu Beginn der Datei. Unterstützung für Arrays, Verpflichtungen, Formatüberprüfungen, Ausgabe von Hilfe.
Vorteile:
Nachteile: