2011-12-05 106 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在上述兩種情況下),並從任何地方調用子程序調用。