In Perl ci sono blocchi speciali (BEGIN, CHECK, INIT, END) che consentono di gestire il tempo di esecuzione del codice:
BEGIN { ... } — viene eseguito subito durante la compilazione del file (prima del codice principale e del caricamento dei moduli);CHECK { ... } — viene eseguito dopo la compilazione di tutti i file, ma prima della loro esecuzione (non supportato in tutte le versioni di Perl);INIT { ... } — viene eseguito prima dell'inizio dell'esecuzione del codice principale ("runtime");END { ... } — viene eseguito dopo il completamento del programma, quando si esce dallo script.Ordine di esecuzione:
BEGINCHECKINITENDEsempio:
BEGIN { print "BEGIN eseguito "; } CHECK { print "CHECK eseguito "; } INIT { print "INIT eseguito "; } print "Codice principale eseguito "; END { print "END eseguito "; }
Un blocco BEGIN all'interno di un modulo può influenzare lo stato globale del programma se quel modulo è incluso con require, e non con use?
Risposta e esempio:
I blocchi BEGIN vengono eseguiti durante la compilazione, quindi non verranno eseguiti se il modulo è incluso tramite require (durante l'esecuzione, non durante la compilazione), e non tramite use (eseguito durante la compilazione del file includente). Questo può portare a comportamenti inaspettati se l'inizializzazione è affidata a BEGIN.
Storia 1: In un progetto è stato usato
BEGINper inizializzare le variabili d'ambiente, ma il modulo è stato incluso tramiterequire— di conseguenza, le variabili non erano impostate, causando caos nel caricamento delle configurazioni in produzione.
Storia 2: Utilizzando un blocco
ENDper chiudere il descrittore di file, non si sono tenute in considerazione le fermate implicite del processo; a volte il bloccoENDnon veniva eseguito a causa di un'interruzione anomala dell'interprete Perl, portando a dati persi nei log.
Storia 3: I blocchi
CHECKerano l'unico posto per eseguire test di validità dell'ambiente. L'utente ha eseguito lo script in una vecchia versione di Perl, dove non esisteva il bloccoCHECK, e le verifiche semplicemente non venivano eseguite — guasti critici si manifestavano solo in produzione.