我很惊讶今天发现我的一个perl模块使用了另一个模块,但没有导入它。
然而,当我意识到这从未引起任何问题时,我感到震惊!
代码如下:
package This;
# no import for OTHER !!
sub new {
... implementation ...
my $something = OTHER->new(@arguments); # no error!
... more implementation ...
}
那是什么? This
的导入导入OTHER
都没有 - 这是我检查的第一件事。
如果导入This
的代码也导入OTHER
,那么OTHER
可以使用This
吗?
击>
澄清问题:
X
,Y
和Z
是模块。use Y;
中
在 X :use Z;
中
Y
不 use
Z
Y
是否可以访问Z
中的函数和方法(反之亦然)?
答案 0 :(得分:4)
您对“导入”一词的使用有点误导。
Y
是否可以在不导入的情况下访问Z
(反之亦然)?
是的,或多或少。 use
模块只是将其加载到当前脚本中;所有use
d模块都加载到同一个脚本中,因此可以看到彼此(前提是它们按正确的顺序use
d。)。
但是真正的导入 - 模块实际导出的东西,以便它们被复制到use
模块的命名空间 - 将只有被复制到use
模块的命名空间。
例如,考虑一下这个Perl脚本:
use Time::HiRes 'time';
package Foo;
sub time1() { return time(); } # calls the built-in time() function
sub time2() { return Time::HiRes::time(); }
package main;
print Foo::time1(), "\n"; # prints (e.g.) 1323048440
print Foo::time2(), "\n"; # prints (e.g.) 1323048440.80571
print time(), "\n"; # prints (e.g.) 1323048440.8061
它use
是Time::HiRes
模块,并告诉它将Time::HiRes::time
导出到当前命名空间(主命名空间),覆盖内置time
。 (Time::HiRes::time
与time
类似,但它具有亚秒级分辨率;它会提供类似1323048440.80571
而非1323048440
的内容。)所以打包Foo
可以看到Time::HiRes
以及Time::HiRes
内的任何内容,例如time
;但必须明确指出,明确写出Time::HiRes::time
。
(注意:为了简化描述,我将上述内容编写为单个脚本,但在Foo
中定义Foo.pm
并使用use Foo;
加载时,会发生同样的事情。)< / p>
答案 1 :(得分:0)
是的,至少在使用间接包和对象语法时。来自
之类的电话OtherPackage->method()
$anOtherPackageObject->method()
Perl可以在上述两种情况下解析完全限定的子例程名称(&OtherPackage::method
)并从任何地方调用子例程。