3
package AA;

package BB;
use AA;

package CC;
use BB;

我必须加入use AACC,还是隐含的?

4

4 回答 4

9

你可以使用一个模块,只要它之前被某些东西加载过。这就是为什么您可以使用其他模块创建的对象而不知道它们是什么对象类型的原因。例如,您可以使用HTTP::ResponseLWP方法中返回的对象,尽管您从未加载过HTTP::Response自己或意识到它就是那种对象。但是,use唯一导入调用命名空间,因此这些导入不会出现在其他包中(即使您仍然可以使用完整的包规范调用它们)。

您应该use使用您的包想要直接使用的任何模块。也就是说use,您直接创建的对象的模块。

你也不应该依赖其他包来为你加载模块。如果有人更改了这些模块,您会想知道为什么会出现问题。而且,即便如此,您仍依赖模块加载顺序来确保一切正常。

于 2012-07-09T21:16:16.827 回答
4

userequire做两件事:如果模块尚未加载,则加载模块(就像 by ),并调用模块的import方法。不确定加载模块或调用方法如何可以传递。

至于你的第二个问题,主要看AA有没有import方法。

于 2012-07-09T19:30:43.887 回答
1
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;行,您可能会遇到问题,并且它会被删除。

于 2012-07-10T23:13:36.877 回答
-1

这主要取决于所涉及的模块是面向对象的模块还是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所有方法都可以通过使用.BBAACCuse BB

于 2012-07-09T21:45:51.057 回答