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”,它仍然找不到。
答案 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的更多信息。