En Perl, existen bloques especiales (BEGIN, CHECK, INIT, END) que permiten controlar el momento de ejecución del código:
BEGIN { ... } — se ejecuta inmediatamente al compilar el archivo (antes de la ejecución del código principal y antes de cargar módulos);CHECK { ... } — se ejecuta después de compilar todos los archivos, pero antes de su ejecución (no es compatible con todas las versiones de Perl);INIT { ... } — se ejecuta antes de que comience la ejecución del código principal ("tiempo de ejecución");END { ... } — se ejecuta después de que el programa ha finalizado, al salir del script.Orden de ejecución:
BEGINCHECKINITENDEjemplo:
BEGIN { print "BEGIN ejecutado "; } CHECK { print "CHECK ejecutado "; } INIT { print "INIT ejecutado "; } print "Código principal ejecutado "; END { print "END ejecutado "; }
¿Puede un bloque BEGIN dentro de un módulo afectar el estado global del programa si ese módulo se incluye con require en lugar de use?
Respuesta y ejemplo:
Los bloques BEGIN se ejecutan durante la compilación, por lo que no se ejecutarán si el módulo se incluye a través de require (durante la ejecución, no en la compilación), y no a través de use (que se ejecuta durante la compilación del archivo que lo incluye). Esto puede llevar a comportamientos inesperados si la inicialización se basa en BEGIN.
Historia 1: En un proyecto se utilizó
BEGINpara inicializar variables de entorno, y el módulo se incluyó a través derequire— como resultado, las variables no se establecieron, lo que causó caos en la carga de configuraciones en producción.
Historia 2: Al usar el bloque
ENDpara cerrar un descriptor de archivo, no se tuvieron en cuenta las interrupciones implícitas del proceso; a veces, el bloqueENDno se ejecutaba debido a un cierre inesperado del intérprete de Perl, lo que resultaba en datos perdidos en los registros.
Historia 3: Los bloques
CHECKeran el único lugar donde se ejecutaban pruebas de validez del entorno. El usuario ejecutó el script en una versión antigua de Perl, donde no había bloqueCHECK, y las verificaciones simplemente no se llevaron a cabo — fallos críticos solo se manifestaban en producción.