使用Modulename之间有什么区别;并使用Modulename(); ? 有时我会看到,例如,使用鲤鱼;有时使用Carp();
答案 0 :(得分:11)
作为documented,
use Modulename;
与
基本相同BEGIN {
require Modulename;
import Modulename;
}
而
use Modulename ();
与
基本相同BEGIN { require Modulename; }
这意味着parens指定您不想导入任何内容。 (这也会阻止一个pragma做它的工作。)
默认情况下,鲤鱼导出confess
,croak
和carp
,所以
use Carp;
是
的缩写use Carp qw( confess croak carp );
使用
use Carp (); # or: use Carp qw( );
confess
,croak
和carp
将不会添加到调用方的命名空间中。它们仍将通过其完全合格的名称提供。
use Carp ();
Carp::croak(...);
答案 1 :(得分:4)
如果没有()
,将调用包的import
方法,可能导致一些默认名称集导出到调用包的名称空间中。
明确地传递()
说“不要将任何名称导入我的命名空间。”
大多数现代的面向对象模块都不会默认导出任何内容,如果他们愿意,也没有什么能阻止他们手动污染调用者的命名空间,但指定()
是一个你不依赖的信号因为你导入了一个包而神奇地出现的名字。
答案 2 :(得分:3)
来自perlfunc documentation on use
:
如果您不想调用包的
import
方法(例如, 为了阻止你的命名空间被改变),明确提供 空列表:use Module ();
这完全等同于
BEGIN { require Module }
答案 3 :(得分:2)
如果你不想调用包的导入方法(例如, 为了阻止你的命名空间被改变),明确提供 空列表:
use Carp;
会导入一些函数(carp
等),但use Carp ();
不会导入任何函数。