如何从基础模块导入全局变量?

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().

Sin*_*nür 5

嗯,有一些问题:

  1. 正如布莱恩所指出的,如果不使用全局变量,你的问题可能会得到更好的解决.如果你描述的你想要实现的目标而不是如何,我们可以提供更好的答案.

  2. 如果你要导出东西,你需要一个sub import或者你需要继承Exporter.见perldoc Exporter.

  3. 目前尚不清楚您希望调用new发生的位置.

  4. 正如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)