In Perl, l'ambito visivo delle variabili è determinato dalle parole chiave my e local.
my crea una variabile con un ambito lessicale (opera solo nel blocco corrente).local salva temporaneamente il valore corrente di una variabile globale e ne imposta uno nuovo per la durata del blocco — di solito viene usato solo con variabili globali (ad esempio, $_, $/ e altro).Esempio:
my $x = 42; # visibile solo nel blocco corrente { local $/ = undef; my $input = <STDIN>; # $/ qui è undef, dopo il blocco ripristinerà il valore }
Usare my è preferibile per via di un ambito visivo più prevedibile.
Cosa succede quando si usano my e local con la stessa variabile dichiarata in due blocchi diversi?
Spesso si risponde che
localemyfunzionano allo stesso modo, ma non è così.localfunziona solo con variabili globali (variabili di pacchetto). Una variabile dichiarata conmyè invisibile perlocal.
Esempio:
our $foo = "global"; { local $foo = "local"; print $foo; # "local" } print $foo; # "global" { my $foo = "lexical"; } # $foo al di fuori del blocco — la versione globale, non "lexical"
Storia
In uno script è stata usata local per la sostituzione temporanea di una variabile dichiarata tramite my, il che non portava a nessun risultato e causava bug nella gestione degli eventi in uno dei moduli interni.
Storia
Nel progetto si è "localizzato" $_ tramite local all'interno di foreach, aspettandosi la sostituzione di $_ per gli iteratori, dimenticando che foreach già imposta un nuovo $_. Risultato — filtro non funzionante e logica errata di percorrenza.
Storia
Una variabile globale di pacchetto non era stata dichiarata tramite our, e il tentativo di localizzazione tramite local $var portava al crash dello script a causa di strict e warning, e il debug ha richiesto un giorno.