Un esempio notevole di utilizzo dell’operatore
my per dichiarare variabili, il cui ambito di visibilità è locale a un blocco, è rappresentato dalle
subroutine ricorsvie, ossia subroutine che richiamano se stesse fino a che una determinata condizione non viene verificata; è fondamentale che questa condizione esista onde evitare la creazione di un loop infinito. Un classico esempio di subroutine ricorsiva è il
calcolo del fattoriale di un numero:
sub fattoriale{ my ($value) = @_;
if($value == 1)
{ return(1);
}
return($value * fattoriale($value - 1));
}
print fattoriale(6);
Come si evince dagli esempi finora illustrati, Perl è un linguaggio molto permissivo, in quanto si adatta alle scelte del programmatore senza intromettersi nello stile di programmazione. Ciononostante, è possibile configurare Perl in modo da ottenere un controllo più restrittivo su ciò che lo sviluppatore scrive, evitando così grossolani errori di programmazione. Oltre alla già descritta opzione
-w per abilitare i
warning di compilazione, il package di installazione di Perl comprende per default anche il modulo
strict, il quale esegue in fase di compilazione una serie di verifiche, tra cui quella che obbliga il programmatore a dichiarare tutte le variabili globali prima di usarle.
L’abilitazione di questo
modulo — ai moduli verrà dedicato un capitolo apposito del tutorial; per il momento, si pensi ad essi come a un insieme di subroutine preconfezionate, che estendono le funzionalità di base di Perl — mediante la funzione
use, rappresenta una buona regola di programmazione, in quanto permette di avere un maggiore controllo sulle variabili con
scope globale, evitando così conflitti ed errori dovuti a modifiche di tali variabili da parte di blocchi di codice differenti.
Con l’utilizzo del modulo
strict, l’esempio della prima parte di questa lezione verrebbe riscritto nel seguente modo:
use strict;
my $scalar = "globale";
print "Fuori dal blocco, $scalar e’ una variabile $scalar\n";
{ my $scalar = "locale";
my $other_scalar = "I am also lexical";
print "Dentro il blocco, $scalar e’ una variabile $scalar\n";
}
print "Di nuovo fuori dal blocco, $scalar e’ sempre una variabile $scalar\n";
Il modulo
strict verifica anche l’
utilizzo errato di nomi di cui non sia stato specificato il tipo. Ad esempio, l’assegnazione seguente è ambigua in quanto il nome
value può rappresentare una variabile di cui è stato dimenticato il qualificatore di tipo, una chiamata a subroutine, oppure ancora una stringa di cui sono stati dimenticati gli apici:
Il modulo
strict è in grado di evidenziare questa ambiguità, rappresentando in tal modo un ulteriore strumento di debug.