我觉得这可能是一个愚蠢的问题,甚至可能是那些意想不到的煽动性问题之一;我还是很好奇。
我读入了一个配置文件,然后根据内容创建不同类型的对象。一个好的模型是图书馆目录。可以说我有包(类)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/