Per organizzare il codice in Perl si utilizzano moduli (packages), che sono definiti in file separati con estensione .pm.
use (in fase di compilazione) e require (in fase di esecuzione).@INC — questo è un elenco di directory dove Perl cerca moduli.Esempio di modulo:
Foo.pm
package Foo; use strict; use warnings; sub say_hello { print "Hello from Foo! "; } 1;
Collegamento e utilizzo:
use lib '.'; # Aggiunge la cartella attuale a @INC use Foo; Foo::say_hello(); # Stampa: Hello from Foo!
Principali differenze:
use importa il modulo all'inizio dell'esecuzione dello script e chiama automaticamente il metodo import, se presente.require carica il modulo solo al primo richiamo.Qual è la differenza tra use e require? Quando applicare quale operatore?
Risposta:
use— agisce in fase di compilazione, chiama automaticamenteimport(di solito usato per i moduli).require— agisce durante l'esecuzione, necessario quando il nome del modulo è sconosciuto fino all'esecuzione o non deve essere sempre collegato.
Storia
In un grande progetto, hanno collegato la propria libreria tramite
require, dimenticando che utilizza funzioni esportate. La funzione utilizzata non era stata esportata, perchérequirenon chiamaimport. Risultato — non funziona l'importazione dei simboli, deve invocare le funzioni esplicitamente.
Storia
Durante il trasferimento del modulo in una cartella separata hanno dimenticato di aggiungere il percorso alla cartella tramite
use libo di modificare la variabile@INC. Il modulo non veniva trovato, lo script terminava con un errore, anche se il file si trovava nel posto giusto rispetto al progetto.
Storia
In una vecchia applicazione hanno chiamato il modulo con la lettera minuscola, ma l'hanno collegato tramite use con la maiuscola:
use foo;invece diuse Foo;. Perl non ha trovato il modulo, causando malfunzionamenti nelle parti critiche dell'applicazione.