我是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 :(得分: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
。或者您必须将子例程调用为()
。