In Perl, due operatori principali vengono utilizzati per includere moduli: use e require.
use — Include il modulo durante la fase di compilazione. Viene eseguito subito dopo la lettura del file perl, carica il modulo nello spazio dei nomi e chiama il metodo import (se esiste).
require — Esegue il caricamento del modulo durante l'esecuzione (run-time).
require $some_module;).Esempio:
use MyModule; # compile-time; chiama import require 'MyModule.pm'; # run-time; nessun import
È possibile utilizzare
usecon un nome di modulo variabile, ad esempio,use $module_name;?
Risposta: No. L'operatore use richiede un nome di modulo staticamente noto durante la compilazione, mentre require può essere utilizzato con nomi di variabili.
Esempio:
my $module = 'Some::Plugin'; require $module; $module->import();
Storia
Il progetto è stato scritto con un gran numero di plugin caricati dinamicamente. Uno degli sviluppatori ha erroneamente utilizzato 'use $plugin', causando un errore di compilazione. È emerso successivamente che il caricamento è possibile solo tramite require, e solo dopo la chiamata a import.
Storia
In un grande servizio Perl, parte delle librerie veniva caricata tramite 'require', senza chiamare import. Le variabili e le funzioni su cui si contava non erano state importate nello spazio dei nomi, e il codice ha iniziato a terminare con errori di subroutine undefined.
Storia
Uno sviluppatore ha provato a collegare un grande blocco di codice all'interno di una funzione tramite 'use', sperando che il modulo venisse caricato solo se necessario, ma in pratica il modulo è stato caricato già all'avvio, portando a un consumo di memoria non necessario.