ProgrammazioneSviluppatore Perl Senior

Parla delle caratteristiche del lavoro con l'ambito visivo delle variabili in Perl. Quali sono le peculiarità degli operatori my e local?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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.

Domanda trabocchetto

Cosa succede quando si usano my e local con la stessa variabile dichiarata in due blocchi diversi?

Spesso si risponde che local e my funzionano allo stesso modo, ma non è così. local funziona solo con variabili globali (variabili di pacchetto). Una variabile dichiarata con my è invisibile per local.

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"

Esempi di errori reali a causa della mancanza di conoscenza delle sfumature dell'argomento


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.