ProgrammazioneSviluppatore Perl / Sviluppatore senior per il supporto di progetti Perl

Spiega come funzionano lo scoping lessicale e dinamico in Perl, quando si usano my, local e our, e fornisci esempi di problemi derivanti da una comprensione errata di queste differenze.

Supera i colloqui con l'assistente IA Hintsage

Risposta

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.

Domanda insidiosa

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.

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze del tema


Storia

In uno script di analisi dei log, venne registrata la statistica in un hash globale usando local, pensando che stessero cambiando il valore solo all'interno del blocco. Si scopri che la modifica tramite local si era estesa ad altre parti del programma, causando la perdita di dati.

Storia

Nella testazione modulare, molti sviluppatori ridefinivano variabili speciali globali come $/ (separatore di righe) tramite my, causando che le modifiche non avvenissero, i test “fallivano” in modo strano solo parzialmente.

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.