2015-10-05 44 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()