内容

名称

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 消除了这种开销,它会根据您的意图来判断。

loadautoload 的区别

Module::Load 导入两个函数 - loadautoload

autoload 自动导入默认函数,但 load 不导入任何函数。

autoload 可在 BEGIN{}; 下使用。

这两个函数都可以导入指定的函数。

以下代码相同。

load File::Spec::Functions, qw/splitpath/;

autoload File::Spec::Functions, qw/splitpath/;

函数

load

加载指定的模块。

有关详细的加载规则,请参阅 "规则"

autoload

加载指定的模块并导入默认函数。

除了导入函数外,'autoload' 与 'load' 相同。

load_remote

将指定的模块加载到指定的包中。

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' 相同。

autoload_remote

将指定的模块加载到指定的包中,并导入默认函数。

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' 相同。

规则

所有函数都有以下规则来决定它认为你想要什么

导入函数

'load' 和 'autoload' 默认导入,但 'load_remote' 和 'autoload_remote' 未导入。

要使用 'load_remote' 或 'autoload_remote',请在 'use' 中指定。

"load","autoload","load_remote","autoload_remote"

导入选定的函数。

# 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/;
'all'

导入所有函数。

use Module::Load 'all'; # imports load, autoload, load_remote, autoload_remote
'','none',undef

不导入任何函数(loadautoload 未导入)。

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 本身相同的条款重新分发和/或修改它。