local($x) salvaguarda il vecchio valore della variabile globale $x e
le assegna un nuovo valore per la durata della subroutine. Tale valore
è visibile nelle funzioni chiamate da detta subroutine. Tutto
ciò viene fatto al momento dell'esecuzione, per cui si parla di
visibilità dinamica. local() opera sempre su variabili globali,
che vengono chiamate anche variabili di package o variabili dinamiche.
my($x) definisce una nuova variabile, visibile solo nella subroutine
corrente. Ciò viene fatto al momento della compilazione, e dunque
si parla di visibilità lessicale o statica. my() opera su variabili
private, chiamate anche variabili lessicali o, in modo improprio, variabili
con visibilità statica.
Ad esempio:
sub visibile {
print "il valore di var e` $var\n";
}
sub dinamica {
local $var = 'locale'; # nuovo valore temporaneo per la
visibile(); # variabile $var, che resta globale
}
sub lessicale {
my $var = 'privata'; # nouva variabile privata $vatr.
visible(); # (invisibile al di fuori dello scopo della subroutine)
}
$var = 'globale';
visibile(); # scrive globale
dinamica(); # scrive locale
lessicale(); # scrive globale
Si noti come il valore "privata" non venga mai scritto. Ciò
perché tale valore di $var è visibile solo all'interno
del blocco della funzione lessicale() e non nella subroutine chiamata.
In breve, local() non produce ciò che probabilmente pensate, ossia
una variabile privata o locale. local() dà un valore temporaneo ad
una variabile globale. my() è ciò che state cercando se
desiderate ottenere delle variabili private.
Consultate anche le sezioni perlsub/"Private Variables via my()" ["Variabili Private tramite my()", NdT]
e <perlsub/"Temporary Values via local()"> ["Valori Temporanei tramite local()", NdT]
per i dolorosi dettagli.
|