Perl 我有一个带包名的字符串。是否可以获取包变量?

Perl 我有一个带包名的字符串。是否可以获取包变量?,perl,perl-module,Perl,Perl Module,在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 @{$packa

在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

包测试::ChildWithVar; 使用父级“Test::WithVar”

我们的@desired_var=qw(4 5 6);#在子模块中重新定义变量

如果我写

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 ?!
}
我知道我可以使用散列并在其中存储特定于包的变量,而不是使用“我们的”变量。我知道。但我需要一个“我们的”解决方案,或者清楚地认识到这是不可能的


谢谢。

您应该
使用严格的
,原因很多,关于您的案例的原因正在解释中

您可以禁用以下代码的警告,
use strict
emits,方法是

# some code block
{  
   ...
   no strict 'refs'; 
   return @{$package_name.'::desired_var'};
}

你应该试着把你真正想要达到的目标放在一个单独的问题中,并解释为什么你认为,这只能通过
我们的
变量来实现。

谢谢!它起作用了。我想我可以在一个小函数中关闭严格的ref,不会发生什么不好的事情:)。是的,刚刚添加了这个。你所描述的是一个角色吗?那可能是……的工作。。。c、 f.@G.Cito上的这篇比较好的文章,不,我不认为我需要角色。但感谢您的关注和链接。)