首页 > 解决方案 > 不同的新基于条件

问题描述

我有这个 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

考虑到唯一的区别是V1V2基于$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"
);

但我得到了错误:Can't call method new on an undefined value

标签: perl

解决方案


您可以将类存储在字符串中并使用它来引用包:

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->(),
);

推荐阅读