ProgrammatieBackend ontwikkelaar

Welke manieren zijn er om modules te organiseren en te importeren in Perl? Hoe werkt het @INC-systeem en use/require? Geef een voorbeeld van het maken en verbinden van een eigen module.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Voor het organiseren van code in Perl worden modules (packages) gebruikt, die zijn opgesteld in aparte bestanden met de extensie .pm.

  • Om een module te verbinden, worden use (op compilatietijd) en require (op uitvoeringstijd) toegepast.
  • Bij het zoeken naar een module gebruikt Perl een speciale array @INC — dit is een lijst van directories waar Perl naar modules zoekt.

Voorbeeld van een module:

Foo.pm

package Foo; use strict; use warnings; sub say_hello { print "Hello from Foo! "; } 1;

Verbinden en gebruiken:

use lib '.'; # Voegt de huidige map toe aan @INC use Foo; Foo::say_hello(); # Toont: Hello from Foo!

Belangrijkste verschillen:

  • use importeert de module aan het begin van de scriptuitvoering en roept automatisch de import-methode aan, als die er is.
  • require laadt de module pas bij de eerste aanroep.

Misleidende vraag

Wat is het verschil tussen use en require? Wanneer moet welke operator worden toegepast?

Antwoord:

  • use — werkt op compilatietijd, roept automatisch import aan (wordt meestal gebruikt voor modules).
  • require — werkt op uitvoeringstijd, nodig wanneer de modulenaam pas tijdens uitvoering bekend is of niet altijd moet worden geïmporteerd.

Voorbeelden van echte fouten door het onbekend zijn van de subtiliteiten van het onderwerp


Verhaal

In een groot project werd een eigen bibliotheek via require verbonden, vergeten dat deze geëxporteerde functies gebruikt. De gebruikte functie was niet geëxporteerd, omdat require import niet aanroept. Resultaat — werkt de import van symbolen niet, functies moeten expliciet worden aangeroepen.


Verhaal

Bij het verplaatsen van een module naar een aparte map werd vergeten om het pad naar de map toe te voegen via use lib of de @INC-variabele te wijzigen. De module kon niet worden gevonden, het script eindigde met een foutmelding, ook al lag het bestand op de juiste plaats ten opzichte van het project.


Verhaal

In een oude applicatie werd de module met een kleine letter genoemd, maar werd met een hoofdletter gekoppeld: use foo; in plaats van use Foo;. Perl kon de module niet vinden, waardoor de functionaliteit van kritieke delen van de applicatie werd aangetast.