Перечислите все модули в файле .pm и получите ссылку на них всех

#perl #oop #package

#perl #ооп #пакет

Вопрос:

Я пытаюсь избежать Module::Pluggable и упростить задачу.

Вот что я делаю, у меня есть набор модулей, хранящихся в modules/ , все пакеты, определенные внутри, имеют одинаковые имена методов:

 # in XX.pm
package MyClass::XX;
sub new {}    
sub method_1 {}    
sub method_2 {}

# in YY.pm
package MyClass::YY;
sub new {}    
sub method_1 {}    
sub method_2 {}
  

(Но обратите внимание, что в одном файле .pm может быть определено более одного модуля)

Теперь я хочу, чтобы все объекты были привязаны к этим модулям, например [ XX->new, YY->new]

Возможно ли это?

Комментарии:

1. XXX->new и т.д. обычно возвращает ссылку, которая включена в пакет XXX , но не является ссылкой на пакет XXX , что бы это ни было. Возможно, вы могли бы уточнить свой вопрос.

2. Извините, это не более понятно. Что такое ссылка на модуль? Похоже, вас могут заинтересовать объекты, благословленные в каждом пакете.

3. @mob objects тогда, извините, я действительно смущен этими терминами;-(

4. Обновлен вопрос @mob

5. «Я пытаюсь избежать Module::Pluggable и упростить задачу». — Вторая половина вашего предложения, похоже, противоречит первой 🙂

Ответ №1:

Вы должны иметь возможность просматривать этот modules/ каталог, который, по вашим словам, у вас есть, и собирать в нем список файлов. (Используйте opendir или еще лучше, Path::Tiny для сбора списка файлов.) Затем:

 my @classes = map {
   (my $class = $_) =~ s{/}{::}g;
   $class =~ s{.pmz}{};
   $class;
} @files;
  

В приведенном выше примере я предполагаю довольно стандартное сопоставление имени файла с именем класса. Не стесняйтесь настраивать его, если он не подходит для вашей ситуации.

Как только у вас будет список классов, вы можете довольно легко получить список объектов обратно:

 my @objects = map $_->new, @classes;
  

Лично я бы использовал Module::Pluggable, хотя. Не бойтесь предупреждений об устаревании. Модуль не является устаревшим. Предупреждения означают, что копия Module::Pluggable, которая поставляется в комплекте с интерпретатором Perl, постепенно удаляется. Вместо этого вы должны установить копию из CPAN.