perl – 为什么包A中的函数在递归调用时不会导入到包B中?
我正在尝试使用两个包并从一个调用函数到另一个,但我有这个错误:
未定义的子程序& module2 :: method_1_2在module2.pm第20行调用. 有没有办法从一个包调用函数到另一个包而不会出现此错误? 提前致谢. 哈维 执行错误: ./test.pl method_1_1 method_2_1 method_2_2 Undefined subroutine &module2::method_1_2 called at module2.pm line 20. 示例代码(test.pl): #!/usr/bin/perl use strict; use module1; use module2; method_1_1(); method_2_2(); module1.pm package module1; use strict; use module2; require Exporter; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); @EXPORT = qw( method_1_1 method_1_2 ); sub method_1_1 { print "method_1_1n"; method_2_1(); } sub method_1_2 { print "method_1_2n"; } 1; module2.pm: package module2; use strict; use module1; require Exporter; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); @EXPORT = qw( method_2_1 method_2_2 ); sub method_2_1 { print "method_2_1n"; } sub method_2_2 { print "method_2_2n"; method_1_2(); } 1; 解决方法
问题是module1做的第一件事就是使用module2.这意味着在module1仍在编译时读取并执行所有module2.
接下来要做的是module2确实使用module1.因为找到了module1并将其放入%INC中,Perl不会再次执行它,只需要执行module1-> import来获取导出的符号. 但是,当然module1实际上几乎没有开始编译,@ module1 :: EXPORT甚至不存在,更不用说它的两个子程序了.这使得Exporter根本无法导入module2,因此当调用method_1_2()时,它对此一无所知. 解决此问题的最简单方法是在编译之后(包括所有use语句和BEGIN块)但在运行时之前执行导入. Perl的 package module2; use strict; use warnings; use module1; INIT { module1->import } use base 'Exporter'; our @EXPORT = qw( method_2_1 method_2_2 ); sub method_2_1 { print "method_2_1n"; } sub method_2_2 { print "method_2_2n"; method_1_2(); } 1; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |