2011-12-12 14 views

risposta

11

locale ($ x) salva via il vecchio valore della variabile globale $ x e assegna un nuovo valore per tutta la durata della subroutine che è visibile in altre funzioni chiamate da quella subroutine. Questo è fatto in fase di esecuzione, quindi è chiamato ambito dinamico. local() influenza sempre le variabili globali , chiamate anche variabili del pacchetto o variabili dinamiche.

my ($ x) crea una nuova variabile che è visibile solo nella subroutine corrente. Questo è fatto in fase di compilazione, quindi è chiamato lessico o scope statico. my() influenza sempre variabili private, chiamate anche variabili lessicali o variabili (impropriamente) statiche (con scope).

Date un'occhiata al Perl-FAQ's:

+0

Grazie mille – Anil

+6

"my ($ x) crea una nuova variabile che è visibile solo nella subroutine corrente". Quello non è vero. 'my' crea una nuova variabile che è visibile solo nell'attuale * blocco di codice *. Una subroutine è solo un esempio di un blocco. Si commette un errore simile nella definizione di 'local'. –

+0

@ O.D http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs – TLP

3

aggiungerò un esempio veloce.

$var = "Global"; 

sub inner { 
    print "inner:   $var\n"; 
} 

sub changelocal { 
    my $var = "Local"; 
    print "changelocal: $var\n"; 

    &inner 
} 

sub changedynamic { 
    local $var = "Dynamic"; 
    print "changedynamic: $var\n"; 

    &inner 
} 

&inner 
&changelocal 
&changedynamic 

Fornisce il seguente risultato (commenti aggiunti).

inner:   Global # Finds the global variable. 
changedynamic: DynamiC# Dynamic variable overrides global. 
inner:   DynamiC# Find dynamic variable now. 
changelocal: Local # Local variable overrides global. 
inner:   Global # The local variable is not in scope so global is found. 

Si può pensare a una variabile dinamica come a un modo per mascherare un globale per le funzioni chiamate. Dove le variabili con ambito lessicale sono visibili solo dal codice all'interno delle parentesi graffe più vicine.

Problemi correlati