导出的Perl sub未找到

时间:2012-08-30 17:44:31

标签: perl export undefined subroutine

我偶尔遇到这个问题。出于某种原因,我得到了未定义的子程序"尝试调用导出的子时出错,我不知道为什么因为它似乎在成熟的代码中突然发生。

最后一次发生时我觉得我使用了像#34; package_2 :: exported_sub()这样的东西。"这次工作有效,但它只是在package_2中为另一个sub返回了一个错误。甚至把"使用package_2;"在上面的行中没有帮助!我唯一能想到的是导出的sub以某种方式未定义。

我的代码看起来有点像这样:

在文件package_1.pm中:

package package_1;

require Exporter;
@ISA = qw( Exporter );

@EXPORT = qw(
local_sub
);

use package_2;
use strict;
use warnings;
use diagnostics;

sub local_sub {
  &exported_sub;
}

在文件package_2.pm中:

package package_2;

require Exporter;
@ISA = qw( Exporter );

@EXPORT = qw(
exported_sub
);

use strict;
use warnings;
use diagnostics;

sub exported_sub {
 # do something
}

我的机智结束了...当我弹出一个不相关的热门票时,明天开始用户测试!

提前致谢!


更新

ikegami,谢谢你的修复!不过我很好奇。我再次遇到这个,但这次我从来没有找到循环依赖。我把它缩小到一行:

$row->{$attr} = ' ' unless ( $row->{$attr} );

显然,这条线与使用或要求完全没有关系!我已经查看过Apache日志,但似乎没有什么真正脱颖而出,但会努力解决我找到的任何问题。我还会看到我是否能收到更多警告。

除此之外,您建议下一步做什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

我怀疑你有循环依赖:package_1使用package_2,package_2使用package1(直接或间接)。

以下是我最初在PerlMonks上发布的解决方案:http://www.perlmonks.org/?node_id=778639


[需要使用这种技术是系统设计缺陷的一个非常有力的指标,但我认识到资源并不总是可用于修复设计缺陷。 ]

如果ModA使用ModB,ModB使用ModA,ModA或ModB从另一个导入符号,则需要注意代码执行顺序。我发现避免出现问题的最好方法是在加载任何其他模块之前设置Exporter。

ModA.pm

package ModA;

use strict;
use warnings;

BEGIN {
   our @ISA = qw( Exporter );
   our @EXPORT_OK = qw( ... );
   require Exporter;
}

use This;
use ModB;
use That;

...

1;

ModB.pm

package ModB;

use strict;
use warnings;

BEGIN {
   our @ISA = qw( Exporter );
   our @EXPORT_OK = qw( ... );
   require Exporter;
}

use This;
use ModA;
use That;

...

1;

答案 1 :(得分:1)

您确定use行与use package_2 qw(xyz);之类的行完全相同吗?

后者将定义Exporter的import()子例程将导出到调用者模块的内容。

答案 2 :(得分:0)

我希望我的经验适合你的情况。 Perl包名必须填充命名空间。 如果您的模块文件位于路径$ PERL_LIB / Fruit / Apple.pm中 然后在模块文件中,您必须指定Namespace Fruit ::

package Fruit::Apple;

.......

如果你只写

package Apple;

.......

没有编译错误。但是当你在模块文件Apple.pm中调用你的方法时,会出现'Undefined subroutine'错误。