Создание модуля из содержимого переменной - PullRequest
3 голосов
/ 04 декабря 2010

Я чувствую, что это может быть глупый вопрос или даже один из тех неожиданно подстрекательских;Тем не менее мне любопытно.

У меня есть файл конфигурации, который я прочитал, а затем на основе содержимого создаю объекты разных типов.Хорошей моделью был бы каталог библиотеки.Допустим, у меня есть пакеты (классы) 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();

, чтобы мне не нужно было настраиватьОгромное ли дерево?

PS.да, я, вероятно, буду содержать эту функциональность в пакете Книги, то есть не раскрываться, но в конечном итоге мне придется разбираться с этим любым способом, которым я это делаю.

1 Ответ

4 голосов
/ 04 декабря 2010

Просто создайте имя класса, поместив его в скаляр, а затем создайте его экземпляр:

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

Помните, что LHS оператора -> может быть в значительной степени чем-либо, что оценивает объект или имя класса.

Так что вы также можете сделать что-то вроде этого:

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

но это довольно уродливо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...