Module::Load - 运行时加载模块和文件
use Module::Load;
my $module = 'Data::Dumper';
load Data::Dumper; # loads that module, but not import any functions
# -> cannot use 'Dumper' function
load 'Data::Dumper'; # ditto
load $module # tritto
autoload Data::Dumper; # loads that module and imports the default functions
# -> can use 'Dumper' function
my $script = 'some/script.pl'
load $script;
load 'some/script.pl'; # use quotes because of punctuations
load thing; # try 'thing' first, then 'thing.pm'
load CGI, ':all'; # like 'use CGI qw[:standard]'
Module::Load
消除了需要知道您是要加载文件还是模块的必要性。
如果您查看 perldoc -f require
,您会发现 require
在给定一个裸字或一个字符串时会有不同的行为。
对于字符串,require
假设您要加载一个文件。但对于裸字,它假设您指的是一个模块。
这在您尝试在运行时动态加载模块时会带来很大的开销,因为您需要将模块表示法 (Acme::Comment
) 更改为适合您所处平台的文件表示法。
Module::Load
消除了这种开销,它会根据您的意图来判断。
load
和 autoload
的区别Module::Load
导入两个函数 - load
和 autoload
autoload
自动导入默认函数,但 load
不导入任何函数。
autoload
可在 BEGIN{};
下使用。
这两个函数都可以导入指定的函数。
以下代码相同。
load File::Spec::Functions, qw/splitpath/;
autoload File::Spec::Functions, qw/splitpath/;
加载指定的模块。
有关详细的加载规则,请参阅 "规则"。
加载指定的模块并导入默认函数。
除了导入函数外,'autoload' 与 'load' 相同。
将指定的模块加载到指定的包中。
use Module::Load 'load_remote';
my $pkg = 'Other::Package';
load_remote $pkg, 'Data::Dumper'; # load a module to 'Other::Package'
# but do not import 'Dumper' function
要加载的模块必须用引号括起来。
除了指定包和用引号括起来模块名称外,'load_remote' 与 'load' 相同。
将指定的模块加载到指定的包中,并导入默认函数。
use Module::Load 'autoload_remote';
my $pkg = 'Other::Package';
autoload_remote $pkg, 'Data::Dumper'; # load a module to 'Other::Package'
# and imports 'Dumper' function
要加载的模块必须用引号括起来。
除了指定包和用引号括起来模块名称外,'autoload_remote' 与 'load_remote' 相同。
所有函数都有以下规则来决定它认为你想要什么
如果参数中包含除匹配 \w
、:
或 '
的字符之外的任何字符,则它必须是文件
如果参数仅匹配 [\w:']
,则它必须是模块
如果参数仅匹配 \w
,则它可以是模块或文件。我们将首先尝试在 @INC
中找到 file.pm
,如果失败,我们将尝试在 @INC 中找到 file
。如果两者都失败,我们将使用相应的错误消息退出。
'load' 和 'autoload' 默认导入,但 'load_remote' 和 'autoload_remote' 未导入。
要使用 'load_remote' 或 'autoload_remote',请在 'use' 中指定。
导入选定的函数。
# imports 'load' and 'autoload' (default)
use Module::Load;
# imports 'autoload' only
use Module::Load 'autoload';
# imports 'autoload' and 'autoload_remote', but don't import 'load';
use Module::Load qw/autoload autoload_remote/;
导入所有函数。
use Module::Load 'all'; # imports load, autoload, load_remote, autoload_remote
不导入任何函数(load
和 autoload
未导入)。
use Module::Load '';
use Module::Load 'none';
use Module::Load undef;
由于 Perl 中的一个 bug(#19213),至少在 5.6.1 版本中,我们必须在 Win32 上将 require 的路径分隔符硬编码为 /
,就像 Unix 上一样,而不是 Win32 的 \
。否则,如果再次需要这些文件,或者在最坏的情况下,Perl 将无法准确地读取它自己的 %INC,从而导致双重加载文件或核心转储。
Module::Load
无法进行隐式导入,只能进行显式导入。(换句话说,您始终必须明确指定要从模块中导入的内容,即使这些函数在该模块的 @EXPORT
中。)
Module::Runtime 提供用于加载模块、检查模块名称的有效性、将模块名称转换为部分 .pm
路径以及相关实用程序函数的函数。
"require" 在 perlfunc 中 和 "use" 在 perlfunc 中。
Mojo::Loader 是一个“类加载器和插件框架”,包含在 Mojolicious 发行版中。
Module::Loader 是一个模块,用于在给定命名空间中查找和加载模块,灵感来自 Mojo::Loader
。
感谢 Jonas B. Nielsen 使显式导入工作正常。
请将错误或其他问题报告给 <[email protected]>。
此模块由 Jos Boumans <[email protected]> 编写。
此库是免费软件;您可以根据与 Perl 本身相同的条款重新分发和/或修改它。