perl模块从未导入的包中调用方法

时间:2011-12-05 00:04:05

标签: perl import dependencies

我很惊讶今天发现我的一个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吗?


澄清问题:

  • XYZ是模块。
  • X use Y; X use Z;
  • Y use Z

Y是否可以访问Z中的函数和方法(反之亦然)?

2 个答案:

答案 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

useTime::HiRes模块,并告诉它将Time::HiRes::time导出到当前命名空间(主命名空间),覆盖内置time。 (Time::HiRes::timetime类似,但它具有亚秒级分辨率;它会提供类似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)并从任何地方调用子例程。