perl模块可以“使用”其他perl模块吗?

时间:2020-04-07 00:06:35

标签: perl

Linux上的perl 5.24.0

Perl模块“嵌套”(某种)问题... 我似乎无法解决这个问题,并且想知道是否有人可以告诉我这是什么问题。下面的简单示例比我的语言更好地阐明了我的问题...

首先,ping.pl ...

#!/usr/bin/env perl
# This is ping.pl

use ping_mod;

ping_dbh();

exit;

接下来是perl模块ping_mod.pm ...

#!/usr/bin/env perl
use Exporter;
use ping_common;

package ping_mod;

@ISA = qw(Exporter);
@EXPORT = qw(ping_dbh);

sub ping_dbh {
    set_dbh();
    print "dbh = $dbh\n";
}

1;

最终是ping_mod使用的ping_common.pm ...

#!/usr/bin/env perl
use Exporter;

our $dbh;

package ping_common;

@ISA = qw(Exporter);
@EXPORT = qw($dbh set_dbh);

sub set_dbh {
    $dbh = 99;
}

1;

运行ping.pl时,我得到...

Undefined subroutine &ping_mod::set_dbh called at ping_mod.pm line 11.

但是如果我将ping_mod.pm更改为...

#!/usr/bin/env perl
use Exporter;
use ping_common;

package ping_mod;

@ISA = qw(Exporter);
@EXPORT = qw(ping_dbh);

sub ping_dbh {
#    set_dbh();
#    print "dbh = $dbh\n";
    print "hi there\n";    
}

1;

...运行正常。因此,我认为它一定可以导出。但是“使用” ping_common会以某种方式将其弄乱。

即使我在ping.pl中“使用ping_common”,它仍然找不到。

1 个答案:

答案 0 :(得分:8)

正如@toolic所说,use ping_common必须在package语句之后。这就是为什么。

Perl中的程序包隔离全局变量和函数。 ping_dbh的全名实际上是ping_mod::ping_dbh。您可以在ping_dbh包中调用ping_mod。如果要在其他地方调用它,则必须使用其全名ping_mod::ping_dbh

use Module实际上是require Module来加载它,而Module->import是将其函数和变量导入到当前包中。只要将模块加载到哪个位置,都没有关系。但是它在哪里导入非常重要。

请牢记这一点。

use ping_common;

package ping_mod;

这将加载ping_common并将其功能导入到默认包ping_mod中,而不是导入到main中。 ping_mod无法使用它们。

package ping_mod;

use ping_common;

这也会加载ping_common,但会将其函数导入ping_mod

但是,即使在包外,导出器为何仍然可以工作?

use Exporter;
use ping_common;

package ping_mod;

@ISA = qw(Exporter);
@EXPORT = qw(ping_dbh);
具有讽刺意味的是,导出器无法通过导出工作。它通过继承起作用。 @ISA = qw(Exporter);使ping_mod从Exporter继承import方法。由于@ISA位于ping_mod包中,因此它是全局变量@ping_mod::ISA


.pm文件通常应以package语句开头。它们不应以#!开头;虽然没有任何伤害。 #!告诉操作系统使用什么来将文件作为可执行程序运行。 Perl模块通常不是可执行文件。

您可以了解有关packages in perlmod的更多信息。