枚举.pm文件中的所有模块,并获取所有模块的引用

时间:2014-07-01 14:21:50

标签: perl oop package

我正在努力避免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 个答案:

答案 0 :(得分:2)

您应该能够遍历您所说的modules/目录,并收集其中的文件列表。 (使用opendir或更好,Path::Tiny收集文件列表。)然后:

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

在上面我假设一个相当标准的文件名到类名映射。如果它不适合你的情况,请随意调整它。

一旦有了类列表,就可以很容易地找回对象列表:

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

我个人虽然使用Module::Pluggable。不要害怕弃用警告。该模块未被弃用。警告意味着与Perl解释器捆绑在一起的Module :: Pluggable副本正在逐步淘汰。相反,您应该从CPAN安装副本。