Storia della domanda:
Sin dalle prime versioni di Perl, la variabile @ARGV forniva un elenco di argomenti della riga di comando. Tuttavia, il parsing manuale portava spesso a errori. Per migliorare la leggibilità e la flessibilità, è stato introdotto il modulo Getopt::Std, successivamente Getopt::Long e moduli esterni di CPAN (ad esempio, MooX::Options, Getopt::Euclid).
Problema:
Il parsing "manuale" spesso non tiene conto di numeri negativi, flag obbligatori e multipli, parametri con spazi. Diversi formati di sintassi (--flag=value, -abc, posizioni miste) possono rendere lo script poco user-friendly e facilmente rompibile se si cambia l'ordine degli argomenti.
Soluzione:
Usare Getopt::Long per una gestione avanzata delle opzioni e dei flag. Supporta opzioni lunghe/corte, auto-rilevamento delle varianti, array, hash e vari formati di flag. Per interfacce CLI molto complesse si utilizzano moduli CPAN con descrizioni dichiarative dei parametri (MooX::Options, MooseX::Getopt).
Esempio di codice:
use Getopt::Long; my $verbose = 0; my $count = 0; my @files; GetOptions( "verbose" => \$verbose, "count=i" => \$count, "file=s" => \@files, ); print "Verbose è $verbose Count è $count Files: @files ";
Caratteristiche principali:
Come distinguere gli argomenti posizionali da quelli opzionali se si utilizza solo Getopt::Std?
Getopt::Std non gestisce opzioni denominate lunghe o separa automaticamente gli argomenti posizionali. Dopo il parsing dei flag corti, gli argomenti posizionali sono disponibili in @ARGV, ma il supporto per la sintassi complessa richiede lavoro manuale.
Qual è la principale differenza tra Getopt::Long e Getopt::Std?
Getopt::Std lavora solo con opzioni corte (a singolo carattere), mentre Getopt::Long è in grado di analizzare flag lunghi, tipi di valori, array/hash e supporta chiavi non alfanumeriche.
È possibile ricevere parametri tramite STDIN, e non solo tramite @ARGV?
Sì, ma questo non è lo standard per Getopt::Long. Per input misti da CLI e STDIN, è necessario leggere manualmente STDIN e integrare questo input nella propria logica di parsing.
Lo script analizza manualmente ogni argomento da @ARGV usando un ciclo, dimenticando i valori dopo --arg, il trattamento di -- e la gestione errata dei numeri negativi (ad esempio, -5 diventa un flag).
Pro:
Contro:
Utilizzo di Getopt::Long con una descrizione concisa di tutte le variabili all'inizio del file. Supporta array, obbligatorietà, controllo del formato, output della documentazione.
Pro:
Contro: