2015-10-05 60 views
0

我是新來的perl,這是正常的調用其他包中的包?重複調用包

main.pl

use MyPkg::Abc(); --> this is calling in Bcd() in Abc.pm 
use MyPkg::Bcd(); --> if i don't call this, then the next line xxx() will be wrong.. 
xxx(); 

Abc.pm

use MyPkg::Bcd(); 
xxx(); 

Bcd.pm

sub xxx(){ 
} 

回答

0

use告訴Perl從另一個包中導入的東西。這樣做很常見 - perl的最大優勢之一就是有很多工作已經完成,您可以重複使用。

當您將一個包裝加載到use中時,並將一些的子例程導入到您當前的命名空間中。偶爾它會在幕後做一些其他有趣的事情。

所以是的 - 你在字面上做的是告訴你的程序,該子程序xxx在另一個模塊中找到,並且你想要使用該變體。

0

您對use行中的括號()感到困惑。

use MyPkg::Abc(); # this is not calling MyPkg::Abc 
use MyPkg::Bcd(); # neither is this 
xxx();    # this calls sub xxx in your package 

當你在你的程序中use Foo::Bar行,Perl會去找一個叫Bar.pm文件的文件夾Foo(所以這是在Windows Foo/Bar.pmFoo\Bar.pm)中並加載它。通常該文件將包含package Foo::Bar。現在Perl知道這個包(也稱爲命名空間)。接下來,它將調用包Foo::Bar中的import子例程。這將使得該包中的一些潛在用戶可以在中調用包(即您的程序)。該過程被稱爲,導入

如果你只想要導入具體的事情,你可以通過把該列表中use這樣以後手串import一個列表

use List::Util ('min', 'max'); 
use List::Util qw(min max); # same as above, just shorter 

現在你在你的程序得到minmax

也有模塊導出(從他們的角度來看,從你的導入)默認情況下。如果你不想讓這些名字空間出現,你可以給use一個空的列表。

use JOSN; # exports 'decode_json' and 'encode_json' by default 
use JSON(); # doesn't export anything 

my $json = JSON->new; 

但是,如果你想要的是從MyPkg::Bcd加載子程序xxx和包裝出口,那麼你應該有那些()那裏。或者你必須調用子程序MyPkg::Bcd::xxx()