perl - 从变量内容实例化模块

标签 perl module

我觉得这可能是一个愚蠢的问题,甚至可能是那些意想不到的煽动性问题之一;我还是很好奇。

我读入了一个配置文件,然后根据内容创建不同类型的对象。一个好的模型是图书馆目录。可以说我有包(类)Books::Historical、Books::SciFi、Books::Romance 等。并且配置有像

这样的散列
%book = (
  type => 'SciFi',
  name => 'Journey to the Center of the Earth',
  ...
);

当我阅读 conf 文件时,我想创建这些类型的对象。我知道我可以做类似的事情:

my $book_obj;
if ($book{'type'} eq 'SciFi') {
  $book_obj = Books::SciFi->new();
  #do stuff with $book_obj
} elsif ($book{'type'} eq 'Romance') { ...

但我想知道是否有某种方法可以做更像

my $book_obj = Books::$book{'type'}->new();

这样我就不需要设置一个巨大的 if 树?

附言。是的,我可能会将此功能包含在 Books 包中,也就是说不会公开,但我最终需要以任何方式处理这个问题。

最佳答案

只需将类名放入标量中构造类名,然后实例化:

my $classname = 'Books::' . $book{type};
my $book_obj = $classname->new;

请记住,-> 运算符的 LHS 几乎可以是任何计算对象或类名的东西。

所以你也可以这样做:

my $book_obj = ${ \"Books::$book{type}" }->new;

但这很丑陋。

关于perl - 从变量内容实例化模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355286/

相关文章:

perl - 如何安装模块?草莓 Perl 问题

python - 没有名为 'win32api' 的模块

javascript - JSDoc:模块和命名空间之间的关系是什么

python - 如何在 Python 中导入第三方模块?

perl - 在 Perl 中进行替换后,如何使用匹配变量 $1?

Perl 管道日志脚本仅每 2 次点击运行一次

mysql - perl 数组搜索 mysql 结果

python - 错误 "specified module could not found"

perl - Perl 5.8 与 5.10 和 5.12 的子例程中的代码延迟评估有什么区别?

linux - 使用 Linux::TunTap 读取数据包