No se puede cargar `Cwd` (y otros módulos no centrales) en tiempo de ejecución
Imagina que quiero cargar un módulo en tiempo de ejecución. Esperaba que esto funcionara
use warnings;
use strict;
eval {
require Cwd;
Cwd->import;
};
if ($@) { die "Can't load Cwd: $@" }
say "Dir: ", getcwd;
pero no lo hace, porBareword "getcwd" not allowed ...
.
losCwd exportacionesgetcwd
por defecto. Traté de dar los nombres de las funciones aimport
e intenté con sus otras funciones. Funciona con el nombre completo,say Cwd::getcwd
, así que creo que no se está importando.
Esto funciona como intento para algunos otros módulos principales que probé, por ejemplo
use warnings;
use strict;
eval {
require List::Util;
List::Util->import('max');
};
if ($@) { die "Can't load List::Util: $@" }
my $max = max (1, 14, 3, 26, 2);
print "Max is $max\n";
NOTA agregada Aparentemente, las llamadas a funciones con paréntesis dan una pista al compilador. Sin embargo, en mi opinión la pregunta permanece, por favor veaEDITAR al final. Además, una función comofirst BLOCK LIST
del módulo anterior no funciona.
De todos modos, esono trabajo para algunos módulos no básicos (bien establecidos) que probé. Peor y más confuso, no funciona incluso con los nombres completos.
Me imagino que el símbolo (función) utilizado no se conoce en tiempo de compilación sirequire
se usa en tiempo de ejecución, pero funciona para (otros) módulos principales. Pensé que esta era una forma estándar de cargar en tiempo de ejecución.
Si necesito usar nombres completos al cargar dinámicamente, entonces está bien, pero ¿qué pasa con la inconsistencia? Y cómohacer ¿Cargo (y uso) módulos no básicos en tiempo de ejecución?
También probé conModule::Load::Conditional
Y no funcionó.
¿Qué me estoy perdiendo y cómo se cargan los módulos en tiempo de ejecución? (Probado con5.16
y5.10.1
.)
EDITAR
Como lo señalóMatt Jacob, una llamada con paréntesis funciona,getcwd()
. Sin embargo, dadoperlsub
NAME LIST;
# Paréntesis opcionales si están predeclarados / importados.
Esto implica que la importación no funcionó y la pregunta de por qué permanece.
Además, tener que usar una sintaxis variada en función de cómo se carga el módulo no es bueno. Además, no puedo hacer que los módulos no básicos funcionen de esta manera, especialmente los que tienen sintaxis comoLista :: MásUtils tiene.