use 声明装载一个模块(如果它还没有被装载),并且把子过程和变量从这个命名模块输入到当前包。(从技术上来讲,它从那个命名模块向当前包输入一些语意,通常是通过把一些子过程或者变量名作成你的包里的别名的方法。)大多数 use 的声明看起来象:
-
use MODULE LIST;
这样和下面是完全一样的:
-
BEGIN { require MODULE; import MODULE LIST; }
BEGIN 迫使 require 和 import 在编译时发生。require 确保该模块在还没有装载的时候装入内存。import 不是内建的函数——它只是一个普通的类方法,调用名字叫 MODULE 的包,告诉该模块把列表里的特性拖到当前包里来。模块可以用自己喜欢的任何方法实现它的输入方法,尽管大多数只是通过从 Exporter 类中继承 import 方法。Exporter 类在 Exporter 模块中定义。参阅第十一章,模块,以及 Exporter 模块获取更多信息。如果找不到 import 方法,那么调用将不声不响地忽略。
如果你不希望你的名字空间被修改,那么明确地提供一个空列表:
-
use MODULE ();
它和下面的代码完全一样:
-
BEGIN { require MODULE; }
因为 use 提供了一个非常开放的接口,所以用法(编译器指示器)也是通过模块来实现的。当前实现了的用法包括:
-
use autouse 'Carp' => qw(carp croak);
-
use bytes;
-
use constant PI => 4 * atan2(1,1);
-
use diagnostics;
-
use integer;
-
use lib '/opt/projects/spectre/lib';
-
use locale;
-
use sigtrap qw(die INT QUIT);
-
use strict qw(subs vars refs);
-
use warnings "deprecated";
许多这些用法模块向当前词法范围输入语意。(它和普通模块不同,普通模块只是向当前包里输入符号,而除了该词法范围是在带有该包的情况下编译的以外,那些符号和当前词法范围没有什么关系。
还有一个对应的声明,no,它“戒除”任何原来用 use 输入的东西,让它们变得不再重要:
-
no integer;
-
no strice 'refs';
-
no utf8;
-
no warnings "unsafe";