2011-12-05 67 views
1

我惊讶地发现今天我的一个perl模块使用了另一个模块,但没有导入它。 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


澄清的问题:

  • XY,和Z是模块。
  • Xuse Y;
  • Xuse Z;
  • YuseZ

是否Y访问的功能和方法Z(反之亦然)?

+1

它被导入某处。我怀疑如果你把这个归咎于[SSCCE](http://sscce.org/),你会发现是这样的。 –

+0

@BrianRoach - 我只是想澄清一下:如果X输入Y,X输入Z,那么Y可以访问Z而不输入它(反之亦然)? –

+0

我相信是的,一旦一个包被导入,它就可以在全球范围内使用,因为OO的方式被固定在perl上,但我不得不测试它;我几年来没有真正写过很多perl,而且有点生疏。 –

回答

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 S中Time::HiRes模块,并告诉它Time::HiRes::time导出到当前的命名空间(主命名空间),覆盖内置time。 (Time::HiRes::time就像time,但它有亚秒级的分辨率;它会给类似1323048440.80571,而不是仅仅1323048440)内Time::HiRes SO封装Foo可以看到Time::HiRes,和任何东西,比如它的time;但必须明确写明Time::HiRes::time

(注:上面我写的是一个脚本,描述简单,但同样的事情发生时FooFoo.pm定义和使用use Foo;加载。)

+0

感谢您对“导入”的提示 - 我试图澄清OP。我相信你的答案的第一部分解决了我的具体问题。谢谢! –

+0

不客气! – ruakh

0

是的,至少当你使用间接包和对象语法。从像

OtherPackage->method() 
$anOtherPackageObject->method() 

Perl可以解决一个完全合格的子程序名(&OtherPackage::method在上述两种情况下),并从任何地方调用子程序调用。