(contributo di brian d foy)
Perl non ha le variabili "statiche", alle quali si può avere accesso solo
dalla funzione nella quale sono dichiarate. Però potete ottenere lo
stesso effetto con le variabili lessicali.
Potete simulare una variabile statica usando una variabile lessicale che
va al di fuori dello scope. In questo esempio, si definisce la subroutine contatore
che usa la variabile lessicale $contatore. Dato che lo inserite in un blocco BEGIN,
$contatore è definito a tempo di compilazione, ma esso va anche fuori dallo
scope alla fine del blocco BEGIN. Il blocco BEGIN assicura anche che la subroutine e
il valore che essa usa sia definito a tempo di compilazione di modo che la subroutine
sia pronta all'uso proprio come ogni altra subroutine, e si possa inserire questo codice
nella stessa posizione come per le altre subroutine nel testo del programma (ovvero, di
solito, alla fine del codice). La subroutine contatore ha ancora un riferimento ai dati e
questa è la sola maniera che avete per accedere al valore (ed ogni volta che lo
fate, ne incrementate il valore). I dati nella porzione di memoria definita da $contatore
è privata per contatore.
BEGIN {
my $contatore = 1;
sub contatore { $contatore++ }
}
my $partenza = contatore();
.... # codice che chiama contatore();
my $fine = contatore();
Nell'esempio precedente, avete creato una variabile privata per una funzione
perch<eacute> solo una funzione si è il suo riferimento. Potreste definire
funzioni multiple mentre la variabile è nello scope, ed ogni funzione
può condividere la variabile "privata". Non è davvero "statica" perché
potete accedervi dal di fuori della funzione finché la variabile lessicale è
nello scope e potete anche creare riferimenti ad essa. In questo esempio, incrementa_contatore e
restituisci_contatore condividono la variabile. Una funzione incrementa il valore e l'altra
semplicemente lo restituisce. Entrambe possono accedere a $contatore e visto che esso è
andato al di fuori dello scope, non c'è altro modo per accedervi.
BEGIN {
my $contatore = 1;
sub incrementa_contatore { $contatore++ }
sub restituisci_contatore { $contatore }
}
Per dichiarare una variabile privata per un file, potete usare ancora una
variabile lessicale. Un file è anche uno scope, dunque una variabile
lessicale definita nel file non può essere vista da qualsiasi altro file.
Consultate perlsub/"Persistent Private Variables" ["Variabili Private Persistenti", NdT]
per maggiori informazioni. La discussione sulle chiusure in perlref potrebbe aiutarvi
anche se non abbiamo usato le subroutine anonime in questa risposta.
Consultate perlsub/"Persistent Private Variables" per i dettagli.
|