ProgrammatieSenior Perl ontwikkelaar

Vertel over de bijzonderheden van het werken met variabele scope in Perl. Wat zijn de nuances van de operators my en local?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Perl wordt de scope van variabelen bepaald door de sleutelwoorden my en local.

  • my creëert een variabele met lexicale scope (is alleen geldig in de huidige block).
  • local slaat tijdelijk de huidige waarde van een globale variabele op en stelt een nieuwe in voor de duur van het bestaan van het block — wordt meestal alleen gebruikt met globale variabelen (bijvoorbeeld, $_, $/ enzovoort).

Voorbeeld:

my $x = 42; # zichtbaar alleen in de huidige block { local $/ = undef; my $input = <STDIN>; # $/ is hier undef, na de block herstelt het de waarde }

Het is beter om my te gebruiken vanwege de voorspelbaardere scope.

Vragen met een haakje

Wat gebeurt er als je my en local gebruikt met dezelfde variabele, gedeclareerd in twee verschillende blocks?

Vaak antwoorden mensen dat local en my hetzelfde werken, maar dat is niet het geval. local werkt alleen met globale variabelen (package variables). Een variabele gedeclareerd met my is onzichtbaar voor local.

Voorbeeld:

our $foo = "global"; { local $foo = "local"; print $foo; # "local" } print $foo; # "global" { my $foo = "lexical"; } # $foo buiten de block — de globale versie, niet "lexical"

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp


Verhaal

In het script werd local gebruikt voor tijdelijke vervanging van een variabele die met my was gedeclareerd, wat leidde tot geen enkel resultaat en bugs in de gebeurtenisverwerking in een van de interne modules.


Verhaal

In het project "lokaliseerden" ze $_ via local binnen foreach, in de verwachting $_ voor iterators te vervangen, terwijl ze vergaten dat foreach al een nieuwe $_ instelt. Resultaat — niet-werkende filter en onjuiste iteratielogica.


Verhaal

De globale package variabele was niet gedeclareerd via our, en de poging tot lokalisatie via local $var leidde tot een crash van het script door strict en warnings, en de debugging nam een hele dag in beslag.