从指定的模块导入一些语义到当前包中,通常是将某些子程序或变量名别名到你的包中。它与
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 的功能启用副作用。