从指定的模块导入一些语义到当前包中,通常是将某些子程序或变量名别名到你的包中。它与
BEGIN { require Module; Module->import( LIST ); }
完全等效,只是模块 必须 是一个裸词。导入可以通过使用 if 模块来进行条件化。
BEGIN
强制 require
和 import
在编译时发生。 require
确保模块如果尚未加载到内存中,则将其加载到内存中。 import
不是内置函数;它只是对 Module
包的普通静态方法调用,以告知模块将功能列表导入回当前包。 模块可以以任何方式实现其 import
方法,尽管大多数模块只是选择通过从 Exporter
模块中定义的 Exporter
类继承来派生其 import
方法。 请参阅 Exporter。 如果找不到 import
方法,则即使存在 AUTOLOAD 方法,也会跳过调用。
如果您不想调用包的 import
方法(例如,为了阻止您的命名空间被更改),请显式提供空列表
use Module ();
这与以下完全相同
BEGIN { require Module }
如果 VERSION 参数出现在 Module 和 LIST 之间,则 use
将使用给定的版本作为参数调用类 Module 中的 VERSION
方法
use Module 12.34;
等同于
BEGIN { require Module; Module->VERSION(12.34) }
从 UNIVERSAL
类继承的 默认 VERSION
方法,如果给定的版本大于变量 $Module::VERSION
的值,则会发出警告。
VERSION 参数不能是任意表达式。 它只有在它是版本号文字时才算作 VERSION 参数,以数字或 v
后跟数字开头。 任何看起来不像版本文字的东西都将被解析为 LIST 的开头。 尽管如此,许多尝试使用任意表达式作为 VERSION 参数的尝试似乎会起作用,因为 Exporter 的 import
方法以特殊方式处理数字参数,执行版本检查而不是将它们视为要导出的东西。
同样,省略 LIST (import
无参数调用) 和显式空 LIST ()
(import
未调用) 之间存在区别。 请注意,VERSION 后面没有逗号!
由于这是一个开放的接口,因此 pragma(编译器指令)也是以这种方式实现的。 一些当前实现的 pragma 是
use constant;
use diagnostics;
use integer;
use sigtrap qw(SEGV BUS);
use strict qw(subs vars refs);
use subs qw(afunc blurfl);
use warnings qw(all);
use sort qw(stable);
其中一些伪模块将语义导入到当前块作用域中(例如 strict
或 integer
),与普通模块不同,普通模块将符号导入到当前包中(在文件末尾之前有效)。
因为 use
在编译时生效,所以它不遵守被编译代码的普通流程控制。特别是,将 use
放置在条件语句的假分支中并不会阻止它被处理。如果模块或pragma只需要在条件下加载,可以使用 if pragma 来实现。
use if $] < 5.008, "utf8";
use if WANT_WARNINGS, warnings => qw(all);
有一个对应的 no
声明,它取消导入由 use
导入的含义,即它调用 Module->unimport(LIST)
而不是 import
。它的行为与 import
相同,使用 VERSION、省略或空的 LIST,或者没有找到 unimport 方法。
no integer;
no strict 'refs';
no warnings;
请参阅 perlmodlib 获取标准模块和pragma的列表。请参阅 perlrun 获取 Perl 的 -M
和 -m
命令行选项,这些选项提供来自命令行的 use
功能。
在词法上启用由 feature pragma 定义的请求版本中可用的所有功能,禁用请求版本的功能包中不存在的任何功能。请参阅 feature。
VERSION 可以是 v 字符串,例如 v5.24.1,它将与 $^V
(也称为 $PERL_VERSION)进行比较,或者是一个数字参数,例如 5.024001,它将与 $]
进行比较。如果 VERSION 大于当前 Perl 解释器的版本,则会引发异常;Perl 不会尝试解析文件的其余部分。与 require
进行比较,后者可以在运行时进行类似的检查。
如果指定的 Perl 版本为 5.12 或更高,则严格模式将像使用 use strict
一样在词法上启用。类似地,如果指定的 Perl 版本为 5.35.0 或更高,则 warnings 将被启用。以后使用 use VERSION
将覆盖之前 use VERSION
的所有行为,可能删除它添加的 strict
、warnings
和 feature
。use VERSION
不会加载 feature.pm、strict.pm 或 warnings.pm 文件。
在当前实现中,任何显式使用 use strict
或 no strict
都会覆盖 use VERSION
,即使它出现在 use VERSION
之前。但是,这可能会在 Perl 的未来版本中发生变化,因此新代码不应该依赖此事实。建议将 use VERSION
声明作为文件中的第一个重要语句(可能在 package
语句或任何数量的空格或注释之后),以便它的效果首先发生,其他 pragma 在它之后应用。
一般情况下,应避免将 VERSION 指定为 5.024001 形式的数字参数,因为它与 v5.24.1 相比,是一种较旧且可读性较差的语法。在 2002 年发布的 Perl 5.8.0 之前,更详细的数字形式是唯一支持的语法,这就是您可能在旧代码中看到它的原因。
use v5.24.1; # compile time version check
use 5.24.1; # ditto
use 5.024_001; # ditto; older syntax compatible with perl 5.6
如果您需要在 use
使用与旧版 Perl 不兼容的库模块之前检查当前 Perl 版本,这通常很有用。(我们尽量避免这样做。)
对称地,no VERSION
允许您指定您想要比指定版本更旧的 Perl 版本。从历史上看,这是在 Raku 语言(以前称为“Perl 6”)的早期设计中添加的,以便 Perl 5 程序可以开始
no 6;
声明它不是 Perl 6 程序。由于这两种语言具有不同的实现、文件命名约定和其他基础设施,因此此功能在实践中很少使用,应在新建的代码中避免。
使用 no VERSION
形式时应谨慎,因为它仅用于断言正在运行的 Perl 版本早于其参数,而不是撤消 use VERSION
的功能启用副作用。