ProgrammatiePerl ontwikkelaar / Lead developer voor ondersteuning van Perl-projecten

Leg uit hoe lexicale en dynamische scoping werkt in Perl, wanneer my, local en our worden gebruikt, en geef voorbeelden van problemen bij een verkeerd begrip van deze verschillen.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Perl kunnen variabelen lexicale of dynamische scoping hebben.

  • my creëert een variabele met lexicale scoping: de variabele is alleen zichtbaar binnen het blok waar het is gedefinieerd.
  • local overschrijft tijdelijk de waarde van een globale (package) variabele met dynamische scoping: de nieuwe waarde is zichtbaar in alle aangeroepen functies tot het verlaten van het blok.
  • our definieert een globale (package) variabele, maar zichtbaar alleen in het huidige lexicale blok.

Voorbeeld:

our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # Zal 10 afdrukken — my $x is niet zichtbaar vanuit inner $| = 1; test_loc(); # Zal 30 afdrukken — local $x is zichtbaar vanuit inner

local wordt gebruikt voor het wijzigen van package-variabelen zoals $_, $/, $@ en anderen.

Vragen met een val

Wat is het resultaat van het uitvoeren van de volgende code en waarom?

our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();

Antwoord: Zal 5 afdrukken. Omdat de my-variabele $a van outer niet zichtbaar is vanuit inner; de package-variabele $a, gedefinieerd met our, wordt gebruikt.

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp


Verhaal

In een loganalyse-script logden ze statistieken in een globale hash met behulp van local, denkend dat ze de waarde alleen binnen het blok wijzigden. Het bleek dat de wijziging via local zich naar andere delen van het programma verspreidde, wat leidde tot gegevensverlies.

Verhaal

Bij modulentesting overschreven veel ontwikkelaars globale speciale variabelen zoals $/ (regel scheidingsteken) met my, wat resulteerde in geen veranderingen, terwijl de tests op vreemde wijze slechts gedeeltelijk faalden.

Verhaal

In de JavaScript-ontwikkeling probeerden ontwikkelaars na de overstap naar Perl uit gewoonte overal variabelen met our te declareren zonder noodzaak, wat leidde tot onverwachte globale variabelen die de encapsulatie verstoorden en naamconflicten veroorzaakten.