首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复调用包

重复调用包
EN

Stack Overflow用户
提问于 2015-10-05 13:02:16
回答 2查看 43关注 0票数 0

我对perl并不熟悉,在另一个包中调用包是正常的吗?

main.pl

代码语言:javascript
复制
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

代码语言:javascript
复制
use MyPkg::Bcd();
xxx();

Bcd.pm

代码语言:javascript
复制
sub xxx(){
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-05 13:05:50

use告诉perl从另一个包中导入内容。这样做很常见-- perl的最大优点之一是已经完成了大量工作,您可以重用这些工作。

当您use一个包时,它会加载它,并将其中的一些子例程导入到当前的命名空间中。偶尔,它会在幕后做一些其他有趣的事情。

所以,是的-你真正要做的是告诉你的程序,子例程xxx是在另一个模块中找到的,并且你想要使用这个变体。

票数 0
EN

Stack Overflow用户

发布于 2015-10-05 13:18:16

您被use行中的括号use弄糊涂了。

代码语言:javascript
复制
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.pmFoo\Bar.pm )并加载它。通常,该文件将包含一个package Foo::Bar。现在Perl知道了这个包(也称为命名空间)。接下来,它将在包import中调用Foo::Bar子例程。这将使调用包(即您的程序)中的一些子包可用。这个过程叫做导入。

如果您只想导入特定的东西,可以将该列表放在import后面,如下所示,为use提供一个字符串列表:

代码语言:javascript
复制
use List::Util ( 'min', 'max' );
use List::Util qw(min max); # same as above, just shorter

现在,您可以在程序中获得minmax

还有一些模块在默认情况下会导出(从它们的角度来看,从您的角度导入)东西。如果不希望这些内容出现在您的命名空间中,可以为use提供一个空列表。

代码语言:javascript
复制
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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32949352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档