我有一个带有包名的字符串。是否可以获取包变量?
I have a string with a package name. Is it possible to get a package variable?
在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 包中定义一个函数,它将 return 我们的变量。
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 继承,子模块将 return WithVar::desired_var 并且我需要 $ChildPackage::desired_var.
包Test::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 ?!
}
我知道我可以使用散列并在其中存储特定于包的变量,而不是使用 'our' 变量。我知道。但是我需要一个 'our' 的解决方案,或者清楚地知道这是不可能的。
谢谢。
你应该 use strict
,出于很多原因,关于你的案例的解释 here。
您可以禁用警告,use strict
为以下代码发出
# some code block
{
...
no strict 'refs';
return @{$package_name.'::desired_var'};
}
您应该尝试将您真正想要实现的目标放在一个单独的问题中,并解释您的想法,这只能通过 our
个变量来完成。
在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 包中定义一个函数,它将 return 我们的变量。
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 继承,子模块将 return WithVar::desired_var 并且我需要 $ChildPackage::desired_var.
包Test::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 ?!
}
我知道我可以使用散列并在其中存储特定于包的变量,而不是使用 'our' 变量。我知道。但是我需要一个 'our' 的解决方案,或者清楚地知道这是不可能的。
谢谢。
你应该 use strict
,出于很多原因,关于你的案例的解释 here。
您可以禁用警告,use strict
为以下代码发出
# some code block
{
...
no strict 'refs';
return @{$package_name.'::desired_var'};
}
您应该尝试将您真正想要实现的目标放在一个单独的问题中,并解释您的想法,这只能通过 our
个变量来完成。