Il Perl ci mette a disposizione un insieme piuttosto ricco di variabili speciali, ossia di variabili gestite direttamente dall'interprete che contengono parametri spesso assai utili.
In molti casi può essere utile passare dei parametri sulla linea di comando al nostro script Perl. I parametri vengono immagazzinati automaticamente nell'array @ARGV: come per ogni altro array $#ARGV indica l'indice dell'ultimo elemento dell'array.
Supponiamo ad esempio di voler scrivere una versione molto semplificata del comando grep di UNIX. Ciò che vogliamo realizzare è uno script che stampi in output le righe dei file di testo della directory corrente che contengono la stringa passata come argomento al programma stesso. Quella che segue è una delle possibili implementazioni di questo programma:
#!/usr/local/bin/perl # grep.pl: versione semplificata di grep $ARGV[0] || die "Non e' stato specificata la stringa da cercare\n\n"; @file = `ls -1`; chop(@file); foreach $file (@file) { -T $file || next; open(IN, "< $file") || next; while ($r = <IN>) { $r =~ /$ARGV[0]/ && print "$file: $r"; } close(IN); } |
L'esempio precedente è sicuramente sovradimensionato per illustrare l'uso dell'array @ARGV, ma può essere utile per richiamare vari concetti visti in precedenza.
Un altro dato che spesso può risultare assai utile è costituito dalle variabili di ambiente, ossia quelle variabili impostate a livello di shell che possono essere utilizzate anche all'interno del programma Perl che le "eredita". Le variabili di ambiente sono memorizzate dall'interprete nell'array associativo %ENV; la chiave per indicizzare gli elementi dell'array è il nome della variabile stessa. Ad esempio la variabile $ENV{term} contiene il tipo di terminale utilizzato dall'utente; la variabile $ENV{path} contiene il path di ricerca delle applicazioni sul sistema dell'utente. Chiaramente impostando un valore nell'array associativo %ENV si imposterà una variabile d'ambiente ereditata anche dai processi richiamati dallo script Perl.
In seguito ad un pattern matching vengono istanziate le seguenti variabili speciali:
$1, $2,... | Contengono i pattern contenuti nelle parentesi del pattern matching (corrispondono ai pattern a cui ci si riferisce con \1, ..., \9 all'interno del pattern matching). |
$& | La stringa che ha verificato l'ultimo pattern matching. |
$` | La stringa che precede quella che ha verificato l'ultimo pattern matching. |
$' | La stringa che segue quella che ha verificato l'ultimo pattern matching. |
$+ | L'ultima parentesi del pattern matching. |
Le seguenti variabili speciali hanno a che fare con le operazioni di I/O su file:
$_ | La variabile di default per le operazioni di input e di pattern matching. |
$. | La linea corrente del file di input. |
$/ | Il separatore di record (di default $/ = "\n"); può essere impostata ad una qualsiasi sequenza di separazione dell'input letto da file. |
Infine le seguenti variabili speciali possono essere utili nel controllare i processi ed i sottoprocessi attraverso uno script Perl:
$$ | Il numero di processo dello script in esecuzione. |
$? | Lo stato di ritorno dell'ultima operazione di esecuzione di un processo esterno |
$0 | Il nome del file contenente lo script in Perl. |
$! | L'ultimo codice di errore generato dallo script. |
$@ | L'ultimo messaggio di errore prodotto dallo script. |
$< | Lo user ID reale del processo. |
$> | Lo user ID effettivo del processo. |