Jul*_*ien 0 perl inheritance export
我用全局变量$ A和$ B创建了一个模块Foo :: Prototype.我想要使用Foo :: Prototype作为基础来导入全局变量$ A和$ B的包Foo :: Bar.我无法想象如何做到这一点.
我知道使用全局变量通常不是一个好习惯,但在这种情况下我想使用它们.
代码如下所示:
package Foo:Prototype;
my ($A, $B);
our @EXPORT = qw($A $B);
sub new {
[...]
$A = 1;
$B = 2;
}
1;
package Foo:Bar;
use base Foo:Prototype qw($A $B);
sub test {
print $A, "\n";
print $B, "\n";
}
1;
# test.pl
Foo:Bar->new();
Foo:Bar->test();
Run Code Online (Sandbox Code Playgroud)
编辑:
我想让Foo :: Prototype的子类尽可能地为其他人编写.我不想写$ self - > {A} - > foo(),而是让人们写$ A-> foo().
嗯,有一些问题:
正如布莱恩所指出的,如果不使用全局变量,你的问题可能会得到更好的解决.如果你描述的是你想要实现的目标而不是如何,我们可以提供更好的答案.
如果你要导出东西,你需要一个sub import
或者你需要继承Exporter
.见perldoc Exporter
.
目前尚不清楚您希望调用new
发生的位置.
正如Greg在下面的注释中指出的那样,my
无法导出在包范围内声明的变量.因此,我宣布$A
并$B
使用our
.
这是"有效"的东西,但在决定这是否是你想要的方式之前,你将不得不做一些阅读和思考.
T.pm:
package T;
use strict;
use warnings;
use base 'Exporter';
our ($A, $B);
our @EXPORT = qw($A $B);
sub new {
$A = 1;
$B = 2;
}
"EOF T.pm"
Run Code Online (Sandbox Code Playgroud)
U.pm:
package U;
use strict;
use warnings;
use base 'T';
use T;
sub test {
my $self = shift;
print "$_\n" for $A, $B;
}
"EOF U.pm"
Run Code Online (Sandbox Code Playgroud)
t.pl:
#!/usr/perl/bin
use strict;
use warnings;
use U;
U->new;
U->test;
C:\Temp> t.pl
1
2
Run Code Online (Sandbox Code Playgroud)