package AA;
package BB;
use AA;
package CC;
use BB;
我必须加入use AA
CC,还是隐含的?
你可以使用一个模块,只要它之前被某些东西加载过。这就是为什么您可以使用其他模块创建的对象而不知道它们是什么对象类型的原因。例如,您可以使用HTTP::Response
从LWP
方法中返回的对象,尽管您从未加载过HTTP::Response
自己或意识到它就是那种对象。但是,use
唯一导入调用命名空间,因此这些导入不会出现在其他包中(即使您仍然可以使用完整的包规范调用它们)。
您应该use
使用您的包想要直接使用的任何模块。也就是说use
,您直接创建的对象的模块。
你也不应该依赖其他包来为你加载模块。如果有人更改了这些模块,您会想知道为什么会出现问题。而且,即便如此,您仍依赖模块加载顺序来确保一切正常。
use
require
做两件事:如果模块尚未加载,则加载模块(就像 by ),并调用模块的import
方法。不确定加载模块或调用方法如何可以传递。
至于你的第二个问题,主要看AA有没有import
方法。
package AA;
package BB;
use AA;
package CC;
use BB;
几乎与以下内容相同:
package CC;
use BB;
BEGIN{ require AA }
或者
package CC;
use BB;
use AA ();
这是因为use
做了两件事。它用 加载文件require
,然后调用import
它的方法。
所以这些是等价的。
use Module qw'LIST';
BEGIN { require Module; Module->import( qw'LIST' ); }
如果包BB
不再需要该use AA;
行,您可能会遇到问题,并且它会被删除。
这主要取决于所涉及的模块是面向对象的模块还是Exporter
用于使调用包中的符号可用的简单模块。
use
首先是require
给定的模块,然后调用它的import
方法。
require
首先检查%INC
模块是否已经成功加载。如果不是,则在中的所有路径中@INC
搜索匹配的模块文件,并加载第一个匹配的do
.
modulesimport
方法可以做任何作者喜欢写的事情,但通常一个模块将子类化Exporter
,它提供一种import
方法,除其他外,将包@IMPORT
数组中的符号复制到调用包,使符号在那里可用,而无需完全限定它们用他们的包名。
在您的示例中,如果模块 subclassExporter
中列出的符号@BB::IMPORT
将被复制到CC
命名空间,并且可以从该包中使用。虽然没有导入任何内容AA
,因此只能通过显式调用它们来调用那里的子例程AA::subroutine()
等。
另一方面,如果包是面向对象的模块和BB
子类AA
,则通常没有import
可调用的方法,并且可以通过祝福变量或类名(包名)访问这些方法。未定义的方法BB
可以继承自AA
,Perl 的面向对象继承系统的实现使用包的@ISA
数组来确定继续搜索方法的位置。
总而言之,如果您的模块BB
子类,Exporter
那么您还必须use AA
. 但是,如果它是面向对象和子类的,那么两者中的AA
所有方法都可以通过使用.BB
AA
CC
use BB