在Perl中,连接模块使用两个主要运算符 — use 和 require。
use — 在编译阶段加载模块。在读取perl文件时立即执行,将模块加载到作用域中并调用import方法(如果存在)。
require — 在运行时加载模块。
require $some_module;).示例:
use MyModule; # compile-time; calls import require 'MyModule.pm'; # run-time; no import
可以使用
use与模块名变量,例如,use $module_name;吗?
**答案:**不可以。运算符use要求在编译时知道模块的静态名称,而require适用于变量名称。
示例:
my $module = 'Some::Plugin'; require $module; $module->import();
故事
项目写了大量动态加载的插件。一个开发者错误地使用了 'use $plugin',导致编译错误。后来发现,加载只能通过require进行,然后调用import。
故事
在一个大型Perl服务中,一部分库通过'require'加载,而没有调用import。依赖的变量和函数没有被导入名称空间,代码开始出现未定义子程序的错误。
故事
开发者尝试在函数内部通过'use'连接一个大代码块,期望模块只在需要时加载,但实际上模块在启动时就被加载了,导致了不必要的内存消耗。