重复调用包
问题描述:
我是新来的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(){
}
答
use
告诉Perl从另一个包中导入的东西。这样做很常见 - perl
的最大优势之一就是有很多工作已经完成,您可以重复使用。
当您将一个包装加载到use
中时,并将一些的子例程导入到您当前的命名空间中。偶尔它会在幕后做一些其他有趣的事情。
所以是的 - 你在字面上做的是告诉你的程序,该子程序xxx
在另一个模块中找到,并且你想要使用该变体。
答
您对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.pm
或Foo\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
现在你在你的程序得到min
和max
。
也有模块导出(从他们的角度来看,从你的导入)默认情况下。如果你不想让这些名字空间出现,你可以给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()
。