我有这个Perl代码:
my $C;
if($someCondition) {
my $A = My::Package::A::V1->new();
my $B = My::Package::B::V1->new();
$C = My::Package::C::V1->new();
} else {
my $A = My::Package::A::V2->new();
my $B = My::Package::B::V2->new();
$C = My::Package::C::V2->new();
}
# Have fun with $C
考虑到唯一的区别是基于V1
的{{1}}或V2
,我发现这很多余。有什么办法可以做类似$someCondition
的事情吗?
如果我也有呢?
my $A = My::Package::A::V{$someCondition ? 1 : 2}->new();
为此,我尝试过:
my $C;
if($someCondition) {
my $C = Some::Package::Z->new(
myPackageA => &My::Package::A::V1
);
} else {
my $C = Some::Package::Z->new(
myPackageA => &My::Package::A::V2
);
}
但是我得到了错误:my $api_version;
if($someCondition) {
$api_version = 'V1';
} else {
$api_version = 'V2';
}
my $C = Some::Package::Z->new(
myPackageA => "&My::Package::A::$api_version"
);
答案 0 :(得分:3)
您可以将类存储在字符串中,并使用它来引用包:
my $api_version;
if($someCondition) {
$api_version = 'V1';
} else {
$api_version = 'V2';
}
die "No API version found" unless $api_version;
my $A = "My::Package::A::$api_version"->new();
my $B = "My::Package::B::$api_version"->new();
my $C = "My::Package::C::$api_version"->new();
# Have fun with $C
如果您还想在名称空间中调用函数(就像您对扩展问题所做的那样),那么简单的方法是关闭strict
并仅使用它们的名称来调用函数:
my $make_A;
{
no strict 'refs';
$make_A = \&{ "My::Package::A::$api_version" };
}
my $C = Some::Package::Z->new(
myPackageA => $make_A->(),
);