Perl contiene molte variabili magiche (anche chiamate "speciali" o "sistemiche") che influenzano l'esecuzione del programma:
$_ — variabile predefinita per molti operatori (foreach, map, grep, while <> e altro).@_ — array degli argomenti in ingresso all'interno delle sottoprogrammi.%SIG — hash con gestori di segnali di sistema operativo.my @nums = (1,2,3); foreach (@nums) { $_ *= 2; # modifica l'array originale! } sub show_args { print "First: ", $_[0], " "; } show_args('a','b'); # $_[0] = 'a' $SIG{INT} = sub { print "Caught Ctrl-C "; exit; };
Attenzione: molte variabili magiche vengono modificate implicitamente; un uso scorretto può influenzare lo stato globale del programma.
È possibile utilizzare in sicurezza la variabile globale $_ in più cicli annidati o sottoprogrammi?
Risposta: No, poiché un ciclo annidato o un sottoprogramma sovrascrive spesso $_, portando alla perdita di valore nel contesto esterno. È consigliabile utilizzare variabili esplicite:
foreach my $x (@a) { foreach my $y (@b) { ... } }
Storia
In uno script per elaborare grandi log, è stato utilizzato un ciclo while(<FH>) {...}. All'interno del ciclo è stata chiamata una funzione, che a sua volta ha eseguito map senza specificare la propria variabile, rovinando $_ nel ciclo esterno, portando a righe saltate.
Storia
Durante l'elaborazione dei segnali tramite %SIG, lo sviluppatore ha sostituito il gestore __DIE__, ma non ha considerato che ciò influisce sul comportamento dell'intero processo, compresi i moduli di terze parti, portando a terminazioni incontrollate in caso di errori nel codice esterno.
Storia
L'ottimizzazione della trasmissione di argomenti tramite riferimento a un array (@_) all'interno della sottoprogramma e il tentativo di modificare i suoi valori direttamente senza copia esplicita ha portato a cambiamenti imprevisti delle variabili nel codice esterno.