我有一个包名称的字符串。是否可以获得包变量?

时间:2015-02-01 09:41:14

标签: perl perl-module

in WithVar.pm:

package Test::WithVar;

our @desired_var = qw(1 2 3);

OtherPackage.pm:

package Test::OtherPackage;
use Test::WithVar;

sub test_get_var ($) {
    my $package_name = shift;

    #↓ How to do that ? Is it possible ? ↓
    return @{$package_name::desired_var};
}

# I know that I can access the desired_var with @Test::WithVar::desired_var,
# (explicitly typed package name, a 'bareword')
# but what if I have package name in a string ?

test_get_var('Test::WithVar');

另一个解决方案(我猜)是在WithVar包中定义一个函数,它将返回我们的变量。

package Test::WithVar;

our @desired_var = qw(1 2 3);

sub return_desired_var ($) {
    my $self = shift;
    our @desired_var;
    return \@desired_var;
}

现在我可以:

package Test::OtherPackage;
use Test::WithVar;

my $str = 'Test::WithVar';
print @{$str->return_desired_var()}, '\n';

但问题在于继承。我需要从WithVar继承,子模块将返回WithVar :: desired_var,我需要$ ChildPackage :: desired_var。

包Test :: ChildWithVar; 使用parent' Test :: WithVar';

我们的@desired_var = qw(4 5 6); #revertfine子模块中的变量。

如果我写

package Test::OtherPackage;
use Test::ChildWithVar;

my $str = 'Test::ChildWithVar';

# This will print 1 2 3 of course, not 4 5 6.
print @{$str->return_desired_var()}, '\n'; 

所以我需要以某种方式在Test :: WithVar包中编写通用方法:

package Test::WithVar;

our @desired_var = qw(1 2 3);

sub return_desired_var_universal ($) {
    my $self = shift;
    my $class = ref $self || $self;
    return $class::desired_var; #Somehow ?!
}

我知道我可以使用哈希并在其中存储特定于包的变量,而不是使用'我们的'变量。我知道。但是我需要一个解决方案,我们需要解决这个问题,或者清楚地认识到这是不可能的。

感谢。

1 个答案:

答案 0 :(得分:2)

出于多种原因,您应该use strict解释有关您案件的问题here

您可以通过

禁用警告,use strict为以下代码发出警告
# some code block
{  
   ...
   no strict 'refs'; 
   return @{$package_name.'::desired_var'};
}

你应该尝试将你真正想要实现的内容放在一个单独的问题中,并解释你为什么这么想,只能用our个变量来完成。