重复调用包

时间:2015-10-05 13:02:16

标签: perl

我是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(){
}

2 个答案:

答案 0 :(得分:0)

use告诉perl从另一个包中导入内容。这样做很常见 - perl的一大优势是已经完成了很多工作,你可以重复使用。

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

所以是的 - 您实际上在做的是告诉您的程序,在另一个模块中找到子例程xxx,并且您想要使用该变体。

答案 1 :(得分: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的文件(这样Foo/Bar.pm或{{1}在Windows上)并加载它。通常该文件将包含Foo\Bar.pm。现在Perl知道该包(也称为命名空间)。接下来,它将调用包package Foo::Bar中的import子例程。这将使调用包(即您的程序)中的某些子包可用。该过程称为导入

如果您只想导入特定内容,可以通过将该列表放在Foo::Bar之后,将import列为列表

use

现在,您的计划中已获得use List::Util ( 'min', 'max' ); use List::Util qw(min max); # same as above, just shorter min

默认情况下,还有一些模块可以导出(从他们的角度来看, import 来自你的)。如果您不希望它们位于您的命名空间中,您可以为max提供一个空列表。

use

但是,如果你想要的只是从use JOSN; # exports 'decode_json' and 'encode_json' by default use JSON (); # doesn't export anything my $json = JSON->new; 加载子例程xxx并且包裹将其导出,那么你应该那些MyPkg::Bcd。或者您必须将子例程调用为()