为什么我不能在Perl程序中调用导出的子程序?

时间:2010-09-15 15:18:59

标签: perl module exporter

我是Perl的新手,我面临以下问题,不知道为什么跟随不起作用。

我的Perl模块包含:

package PACK2;
use Exporter;
@ISA = ('Exporter');
@EXPORT_OK=('whom');

sub why(){
    print "why\n";
}

sub whom(){
      print "whom\n";
}
1;

我的Perl文件包含:

#!/usr/bin/perl -w

use pack;
use pack2 ('whom');

PACK::who();
&whom();

我运行此程序但找不到whom

perl use_pack_pm.pl

who
Undefined subroutine &main::whom called at use_pack_pm.pl line 7.

3 个答案:

答案 0 :(得分:8)

Perl是一种区分大小写的语言。我不认为模块“pack2”和“PACK2”是相同的。 (但我实际上没有测试过这个。)

答案 1 :(得分:5)

内部use pack2 ('whom');被翻译为类似

的内容
BEGIN {
    require pack2;
    pack2->import('whom');
}

除非perl会在尝试调用它之前检查它是否可以在import上调用pack2。 在您的示例中,没有名为pack2的包,因此没有import函数可以调用。 如果您的包名称和文件名匹配,则perl会找到import提供的Exporter函数。

没有任何警告,因为Perl很难说这是故意这样做的。 大多数OO模块不会导出任何函数或变量,因此它们不会提供import函数。

答案 2 :(得分:0)

使用子文件夹树中的模块得到相同的错误,而不在包中声明完整路径。

您应该使用其路径编写package语句。 对于位于子目录Dir中的模块,请写package Dir::Module;,而不是package Module ;。然后就行了。