总结一下我的问题,我不打算复制/粘贴代码,而是写一个简单的代码。 我有3个文件,A.pm,B.pm C.pm。
在A.pm A我有一个带有构造函数的类:
package A;
use strict;
use warnings;
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
$self->{NAME} = "Bob";
bless ($self, $class);
return $self;
}
在我的B.pm文件中,我有:
package B;
use strict;
use warnings;
use A;
our $MyObjectA = new A();
sub myfunctionB {
$MyObjectA->{NAME} = "Angel";
}
在文件C.pm:
package C;
use strict;
use warnings;
use B;
sub myfunctionC {
print("There is the name of my Object".$B::MyObjectA->{NAME}."\n");
}
在主要的p.pl
中use strict;
use warnings;
use B;
use C;
B::myfunctionB();
C::myfunctionC();
结果:子程序C打印Bob,但我想显示Angel。我该怎么办?
答案 0 :(得分:3)
在检索对象名称之前,请致电B::myfunctionB()
。
答案 1 :(得分:0)
这里的主要问题似乎是有一个名为B的CPAN模块。因此,要覆盖加载该模块而不是您自己的模块,可以使用@INC
编译指示将当前目录放在lib
的开头:
<强> A.pm 强>
package A;
use strict;
use warnings;
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
$self->{NAME} = "Bob";
bless ($self, $class);
return $self;
}
1;
<强> B.pm 强>
package B;
use strict;
use warnings;
use A;
our $MyObjectA = A->new();
sub myfunctionB {
$MyObjectA->{NAME} = "Angel";
}
1;
<强> C.pm 强>
package C;
use strict;
use warnings;
use lib '.';
use B;
sub myfunctionC {
B::myfunctionB();
print("The name of my Object: "
. $B::MyObjectA->{NAME}
. "\n"
);
}
1;
<强> p.pl 强>
use strict;
use warnings;
use C;
C::myfunctionC();
运行p.pl
的输出:
The name of my Object: Angel