In Perl, le variabili possono avere scoping lessicale o scoping dinamico.
my crea una variabile con scoping lessicale: la variabile è visibile solo all'interno del blocco in cui è definita.local ridefinisce temporaneamente il valore di una variabile globale (di package) con scoping dinamico: il nuovo valore è visibile in tutte le funzioni chiamate fino all'uscita dal blocco.our definisce una variabile globale (di package), ma visibile solo nel blocco lessicale corrente.Esempio:
our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # Stampa 10 — my $x non è visibile da inner $| = 1; test_loc(); # Stampa 30 — local $x è visibile da inner
local è usato per modificare variabili di tipo speciale di package come $_, $/, $@ e altri.
Quale sarà il risultato dell'esecuzione del seguente codice e perché?
our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();
Risposta: Stampa 5. Perché la variabile $a dichiarata con my in outer non è visibile da inner; viene usata la variabile di package $a, dichiarata con our.
Storia
Storia
Storia
Nello sviluppo JavaScript, dopo il passaggio a Perl, gli sviluppatori per abitudine cercavano di dichiarare variabili con our ovunque senza necessità, portando alla creazione inaspettata di variabili globali, ostacolando l'incapsulamento e causando conflitti di nomi.