6

use Modulename;和有什么区别use Modulename();吗?例如,有时我看到,有时我use Carp;看到use Carp ();

4

4 回答 4

12

记载

use Modulename;

基本上是一样的

BEGIN {
   require Modulename;
   import Modulename;
}

尽管

use Modulename ();

基本上是一样的

BEGIN { require Modulename; }

这意味着括号指定您不想导入任何内容。(它也会阻止编译指示完成它的工作。)


Carp 出口confess,默认情况下,croak所以carp

use Carp;

简称

use Carp qw( confess croak carp );

通过使用

use Carp ();   # or: use Carp qw( );

confesscroak并且carp不会被添加到调用者的命名空间中。它们仍可通过其完全限定名称使用。

use Carp ();
Carp::croak(...);
于 2013-05-16T02:45:03.087 回答
5

如果没有(),将调用包的import方法,可能导致某些默认名称集被导出到调用包的命名空间中。

传递()明确表示“不要将任何名称导入我的命名空间”。

大多数现代面向对象的模块默认情况下不会导出任何内容,如果他们愿意,没有什么可以阻止它们手动污染调用者的命名空间,但指定()是一个信号,表明您不会仅仅因为您导入而依赖于神奇地出现的名称一袋。

于 2013-05-16T02:35:43.910 回答
4

perlfunc 文档中use

如果您不想调用包的import方法(例如,阻止您的命名空间被更改),请显式提供空列表:

use Module ();

这完全等同于

BEGIN { require Module }
于 2013-05-16T02:31:51.550 回答
3

perldoc -f 使用

如果您不想调用包的导入方法(例如,阻止您的命名空间被更改),请显式提供空列表:

use Carp;导入一些函数(carp等),但use Carp ();不导入任何函数。

于 2013-05-16T02:31:50.153 回答