Voor het organiseren van code in Perl worden modules (packages) gebruikt, die zijn opgesteld in aparte bestanden met de extensie .pm.
use (op compilatietijd) en require (op uitvoeringstijd) toegepast.@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.Wat is het verschil tussen use en require? Wanneer moet welke operator worden toegepast?
Antwoord:
use— werkt op compilatietijd, roept automatischimportaan (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.
Verhaal
In een groot project werd een eigen bibliotheek via
requireverbonden, vergeten dat deze geëxporteerde functies gebruikt. De gebruikte functie was niet geëxporteerd, omdatrequireimportniet 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 libof 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 vanuse Foo;. Perl kon de module niet vinden, waardoor de functionaliteit van kritieke delen van de applicatie werd aangetast.