我偶尔遇到这个问题。出于某种原因,我得到了未定义的子程序"尝试调用导出的子时出错,我不知道为什么因为它似乎在成熟的代码中突然发生。
最后一次发生时我觉得我使用了像#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日志,但似乎没有什么真正脱颖而出,但会努力解决我找到的任何问题。我还会看到我是否能收到更多警告。
除此之外,您建议下一步做什么?
谢谢!
答案 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'错误。