加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 为什么包A中的函数在递归调用时不会导入到包B中?

发布时间:2020-12-16 06:22:54 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用两个包并从一个调用函数到另一个,但我有这个错误: 未定义的子程序 module2 :: method_1_2在module2.pm第20行调用. 有没有办法从一个包调用函数到另一个包而不会出现此错误? 提前致谢. 哈维 执行错误: ./test.plmethod_1_1method_2_1method_
我正在尝试使用两个包并从一个调用函数到另一个,但我有这个错误:

未定义的子程序& 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的INIT block非常适用于此,我们可以通过将模块更改为下面的表格来获得代码.我在这里只显示了module2,因为调用模式意味着这就是修复这个特定问题所需的全部内容,但是一般情况需要对所有协作模块进行等效更改.

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读