L'elaborazione degli argomenti della riga di comando avviene tramite l'array incorporato @ARGV, che contiene tutti i parametri passati allo script all'avvio (escluso il nome dello script stesso). Questo è il modo fondamentale per qualsiasi applicazione Perl CLI, ma presenta molte sfumature relative ai tipi di dati, alla codifica, alla separazione dei parametri e alle insidie della lettura automatica dei file.
Dalle prime versioni di Perl, l'array @ARGV ha rappresentato il "punto di ingresso" standard per gli argomenti di avvio, analogamente a argv[] in C. Tuttavia, Perl, essendo un linguaggio di uso generale e per compiti testuali, ha aggiunto molti trucchi aggiuntivi — ad esempio, l'espressione <>, che è "collegata" al contenuto di @ARGV, permettendo di leggere immediatamente i file elencati come argomenti.
La lettura banale di @ARGV è adatta solo per casi semplici. Nei programmi CLI complessi, sorge la necessità di elaborare le opzioni (tipo --help, -o file). Qui la semplice lettura dei dati per indice diventa insicura e scomoda. Ancora più complicato diventa l'elaborazione di argomenti contenenti spazi, caratteri non standard o codifiche diverse. Inoltre, ci sono questioni relative all'apertura automatica dei file tramite l'operatore <> e comportamenti imprevisti se gli elementi di @ARGV sono uguali, ad esempio, a "-" (stdin).
Lettura di argomenti semplici:
foreach my $arg (@ARGV) { print "Arg: $arg "; }
Di solito per le opzioni si utilizza un modulo speciale Getopt::Long:
use Getopt::Long; my $help; GetOptions('help' => \$help);
Per leggere tutti i file da @ARGV, il contenuto dei file può essere letto direttamente tramite un ciclo:
while (<>) { print; }
Cosa succede se uno degli argomenti della riga di comando contiene solo un trattino (-)?
In questo caso, utilizzando l'operatore <>, Perl interpreta '-' come input standard (stdin), non come nome di file.
perl script.pl - file.txt # Lettura prima da stdin, poi da file.txt
È possibile modificare in modo sicuro @ARGV all'interno dello script?
Sì, è una pratica standard per rimuovere argomenti già elaborati. Di solito, dopo l'elaborazione delle opzioni, si lascia in @ARGV solo i "nomi" dei file o parametri non riconosciuti.
È necessario fare encode/decode quando si lavora con argomenti UTF-8 in @ARGV?
Dipende dalla locale e dall'ambiente. Per impostazione predefinita, Perl non converte le codifiche di @ARGV, ma le accetta "così come sono". Pertanto, se i nomi dei file (o i parametri) contengono caratteri non ASCII, è consigliabile decodificare esplicitamente le stringhe usando Encode, se è necessario lavorarci in Perl.
È un'utilità per il parsing dei log che accetta un elenco di file. L'utente indica accidentalmente '-':
perl parse.pl - access.log
come risultato — improvvisamente il programma si blocca e aspetta input dalla tastiera.
Vantaggi:
Svantaggi:
Un programma CLI legge argomenti tramite Getopt::Long, gestendo esplicitamente tutte le opzioni negative e lasciando in @ARGV solo i nomi dei file:
perl report.pl --input access.log --output report.txt
Vantaggi:
Svantaggi: