使用Modulename之间的区别;并使用Modulename();

时间:2013-05-16 02:26:52

标签: perl

使用Modulename之间有什么区别;并使用Modulename(); ? 有时我会看到,例如,使用鲤鱼;有时使用Carp();

4 个答案:

答案 0 :(得分:11)

作为documented

use Modulename;

基本相同
BEGIN {
   require Modulename;
   import Modulename;
}

use Modulename ();

基本相同
BEGIN { require Modulename; }

这意味着parens指定您不想导入任何内容。 (这也会阻止一个pragma做它的工作。)


默认情况下,鲤鱼导出confesscroakcarp,所以

use Carp;

的缩写
use Carp qw( confess croak carp );

使用

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

confesscroakcarp将不会添加到调用方的命名空间中。它们仍将通过其完全合格的名称提供。

use Carp ();
Carp::croak(...);

答案 1 :(得分:4)

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

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

大多数现代的面向对象模块都不会默认导出任何内容,如果他们愿意,也没有什么能阻止他们手动污染调用者的命名空间,但指定()是一个你不依赖的信号因为你导入了一个包而神奇地出现的名字。

答案 2 :(得分:3)

来自perlfunc documentation on use

  

如果您不想调用包的import方法(例如,   为了阻止你的命名空间被改变),明确提供   空列表:

use Module ();
     

这完全等同于

BEGIN { require Module }

答案 3 :(得分:2)

来自perldoc -f use

  

如果你不想调用包的导入方法(例如,   为了阻止你的命名空间被改变),明确提供   空列表:

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