Historia de la cuestión:
Perl ha soportado la carga dinámica y estática de código desde la introducción del soporte para módulos. Para ello, el lenguaje proporciona tres mecanismos diferentes: require, use y do. Cada uno de ellos tiene sus propias características, diferentes ciclos de vida de ejecución e impacto en el contexto de trabajo del programa.
Problema:
La elección incorrecta del mecanismo de carga o el malentendido de las diferencias entre ellos a menudo lleva a errores: carga repetida de módulos, problemas de ámbito, errores en tiempo de ejecución (por ejemplo, carga fallida, variables o funciones no inicializadas).
Solución:
use — conecta el módulo en la etapa de compilación. Llama automáticamente al método import, si está definido. Se utiliza para cargar módulos y declaraciones al inicio del programa.require — carga un archivo o módulo durante la ejecución, solo una vez por programa. Es adecuado para la carga dinámica de archivos bajo condiciones.do — simplemente ejecuta el archivo como código Perl, cada vez que se llama. Se usa raramente, necesario para casos especiales (por ejemplo, archivos de configuración).Ejemplo de código:
use Some::Module; # carga estática if ($config{plugin}) { require "$config{plugin}.pm"; # carga dinámica } do 'local_config.pl'; # ejecuta cada vez que se inicia
Características clave:
use solo funciona con paquetes/módulos, llama a import, se activa en la compilación.require funciona con archivos y módulos, se ejecuta en tiempo de ejecución.do no almacena en caché el módulo, simplemente ejecuta el contenido del archivo.¿Se puede usar require para vincular con una variable y un módulo tipo Some::Module?
Sí, pero debe especificarse explícitamente la ruta al archivo, o transformar el nombre del módulo en una ruta:
my $mod = 'Some::Module'; $mod =~ s!::!/!g; require "$mod.pm"; # correcto
¿Qué ocurre si do no puede encontrar el archivo?
do devuelve falso (undef) y registra un error en $@ — no provoca pánico, como lo hacen use/require.
¿Qué sucede si se llama a require dos veces en el mismo archivo?
require carga el archivo solo la primera vez, llamadas sucesivas no repetirán la carga, incluso si el archivo original ha cambiado.
En el proyecto intentaban conectar plugins sobre la marcha usando do, sin verificar el estado de retorno y confundieron con require.
Ventajas:
Desventajas:
Usaron require para cargar bajo condiciones, siempre transformaban el nombre del módulo en una ruta. Verificaban $@ después de intentar cargar.
Ventajas:
Desventajas: