Geschiedenis van de vraag:
Vanaf de vroegste versies van Perl bood de variabele @ARGV een lijst van commandoregelargumenten. Handmatig parseren leidde echter gemakkelijk tot fouten. Voor betere leesbaarheid en flexibiliteit is de module Getopt::Std ontwikkeld, gevolgd door Getopt::Long en externe CPAN-modules (bijvoorbeeld MooX::Options, Getopt::Euclid).
Probleem:
"Handmatig" parseren houdt vaak geen rekening met negatieve getallen, verplichte en meervoudige vlaggen, parameters met spaties. Verschillende syntaxisformaten (--flag=value, -abc, gemengde posities) kunnen het script onvriendelijk en gemakkelijk breekbaar maken bij het veranderen van de volgorde van argumenten.
Oplossing:
Gebruik Getopt::Long voor geavanceerde parsing van opties en vlaggen. Het ondersteunt lange/korte opties, automatische detectie van varianten, arrays, hashes en verschillende vlagformaten. Voor zeer complexe CLI-interfaces worden CPAN-modules met declaratieve beschrijvingen van parameters toegepast (MooX::Options, MooseX::Getopt).
Voorbeeldcode:
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 ";
Belangrijke kenmerken:
Hoe onderscheid je positionele argumenten van optionele, als alleen Getopt::Std wordt gebruikt?
Getopt::Std kan niet werken met lange benoembare opties of automatisch positionele argumenten scheiden. Na het parseren zijn korte vlaggen positioneel beschikbaar in @ARGV, maar ondersteuning voor complexe syntaxis vereist handmatige arbeid.
Wat is het belangrijkste verschil tussen Getopt::Long en Getopt::Std?
Getopt::Std werkt alleen met korte (één teken) opties, terwijl Getopt::Long lange vlaggen, waarde typen, arrays/hashes kan parseren en niet-alfabetische sleutels ondersteunt.
Is het mogelijk om parameters via STDIN te accepteren, en niet alleen via @ARGV?
Ja, maar dit is geen standaard voor Getopt::Long. Voor gemengde CLI- en STDIN-invoer moet je handmatig STDIN lezen en deze invoer integreren in je parseringslogica.
Een script parseert handmatig elk argument uit @ARGV via een lus, waarbij het waarden na --arg, het werken met -- en de foutieve verwerking van negatieve getallen (bijvoorbeeld, -5 wordt een vlag) vergeet.
Voordelen:
Nadelen:
Het gebruik van Getopt::Long met een korte beschrijving van alle variabelen aan het begin van het bestand. Het ondersteunt arrays, verplichtheid, formatcontrole en het weergeven van hulp.
Voordelen:
Nadelen: