我对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(){
}发布于 2015-10-05 13:05:50
use告诉perl从另一个包中导入内容。这样做很常见-- perl的最大优点之一是已经完成了大量工作,您可以重用这些工作。
当您use一个包时,它会加载它,并将其中的一些子例程导入到当前的命名空间中。偶尔,它会在幕后做一些其他有趣的事情。
所以,是的-你真正要做的是告诉你的程序,子例程xxx是在另一个模块中找到的,并且你想要使用这个变体。
发布于 2015-10-05 13:18:16
您被use行中的括号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将在文件夹Foo中找到一个名为Bar.pm的文件(也就是说,在Foo中是Foo/Bar.pm或Foo\Bar.pm )并加载它。通常,该文件将包含一个package Foo::Bar。现在Perl知道了这个包(也称为命名空间)。接下来,它将在包import中调用Foo::Bar子例程。这将使调用包(即您的程序)中的一些子包可用。这个过程叫做导入。
如果您只想导入特定的东西,可以将该列表放在import后面,如下所示,为use提供一个字符串列表:
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加载子例程MyPkg::Bcd并将其导出,那么您应该在而不是上有这些()。或者您必须将子例程调用为MyPkg::Bcd::xxx()。
https://stackoverflow.com/questions/32949352
复制相似问题