Achtergrond:
Perl ondersteunt dynamische en statische code-lading sinds de introductie van module-ondersteuning. De taal biedt drie verschillende mechanismen: require, use en do. Elk heeft zijn eigen kenmerken, verschillende levenscyclus van uitvoering en invloed op de context van het programma.
Probleem:
Een onjuiste keuze van laadmethode of een gebrek aan begrip van de verschillen leidt vaak tot bugs: herhaalde module-lading, problemen met scopes, runtime-fouten (bijvoorbeeld mislukte laadoperaties, niet-geïnitialiseerde variabelen of functies).
Oplossing:
use — laadt een module tijdens de compilatiefase. Roept automatisch de import methode aan als deze gedefinieerd is. Wordt gebruikt voor het laden van modules en verklaringen aan het begin van het programma.require — laad een bestand of module tijdens runtime, maar slechts één keer per programma. Geschikt voor het dynamisch laden van bestanden op basis van voorwaarden.do — voert het bestand gewoon uit als Perl-code, elke keer bij aanroep. Wordt zelden gebruikt, nodig voor speciale gevallen (bijvoorbeeld configuratiebestanden).Voorbeeld code:
use Some::Module; # statische loading if ($config{plugin}) { require "$config{plugin}.pm"; # dynamische loading } do 'local_config.pl'; # voert elke keer uit bij starten
Belangrijkste kenmerken:
use werkt alleen met package/module, roept import aan, wordt geactiveerd bij compilatie.require werkt met bestanden en modules, wordt geactiveerd tijdens runtime.do cachet de module niet, maar voert alleen de inhoud van het bestand uit.Kan require worden gebruikt voor de verbinding met een variabele en module zoals Some::Module?
Ja, maar je moet het pad naar het bestand expliciet opgeven, of de naam van de module in een pad omzetten:
my $mod = 'Some::Module'; $mod =~ s!::!/!g; require "$mod.pm"; # correct
Wat gebeurt er als do het bestand niet kan vinden?
do retourneert false (undef) en registreert de fout in $@ — het veroorzaakt geen paniek zoals use/require.
Wat gebeurt er als require twee keer hetzelfde bestand wordt aangeroepen?
require laad het bestand slechts één keer, herhaalde aanroepen zullen de laadoperatie niet herhalen, zelfs niet als het oorspronkelijke bestand is gewijzigd.
In het project probeerde men plugins dynamisch te laden met behulp van do zonder de retourstatus te controleren en verwarde men het met require.
Voordelen:
Nadelen:
Men gebruikte require voor conditionele laadoperaties en transformeerde altijd de naam van de module in een pad. Men controleerde $@ na een laadpoging.
Voordelen:
Nadelen: