perl - 不同的新基于条件
问题描述
我有这个 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
或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"
);
但我得到了错误:Can't call method new on an undefined value
解决方案
您可以将类存储在字符串中并使用它来引用包:
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->(),
);
推荐阅读
- vue.js - Vue中的多个因变量
- jupyter-notebook - 如何将单元格字体从 Jupyter 笔记本中的代码(在编辑模式下)更改回正常模式?
- java - 我可以在谷歌地图上打开确切的位置吗?
- rxjs - RxJS:如何循环和处理多个 http 调用
- php - Laravel - 如果给定数组中不存在,则从数据库中删除记录
- floating-point - 为什么这里需要接口才能获得正确的结果
- javascript - 使用 date.getMonth() 时,为什么我的结果是 3?
- data-visualization - 使用参数表过滤数据
- python - 如何在包含链接列表的表格中提取可下载链接,并抓取多个页面
- python - User 类型的对象在 DRF 中不是 JSON 可序列化的