use 模块 版本 列表
use 模块 版本
use 模块 列表
use 模块

从指定的模块导入一些语义到当前包中,通常是将某些子程序或变量名别名到你的包中。它与

BEGIN { require Module; Module->import( LIST ); }

完全等效,只是模块 必须 是一个裸词。导入可以通过使用 if 模块来进行条件化。

BEGIN 强制 requireimport 在编译时发生。 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 参数的尝试似乎会起作用,因为 Exporterimport 方法以特殊方式处理数字参数,执行版本检查而不是将它们视为要导出的东西。

同样,省略 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);

其中一些伪模块将语义导入到当前块作用域中(例如 strictinteger),与普通模块不同,普通模块将符号导入到当前包中(在文件末尾之前有效)。

因为 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 功能。

use VERSION

在词法上启用由 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 的所有行为,可能删除它添加的 strictwarningsfeatureuse VERSION 不会加载 feature.pmstrict.pmwarnings.pm 文件。

在当前实现中,任何显式使用 use strictno 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 的功能启用副作用。