正如@pilcrow 所说,您可以通过使用require
而不是快速解决此问题use
,但是,我认为这是使用多态性的一个很好的例子。
您可以创建一个基类,如:
package Processors::Base;
sub new{
my $class = shift;
return bless {}, $class;
}
sub process{
die "You can only use a subclass of me";
}
1;
然后,将您的处理器创建为从该基本包继承的包。
package Processors::Foo;
sub process{
... do stuff ...
}
1;
然后您的代码可能如下所示:
#!/usr/bin/perl -w
use strict;
for my $pkg (@data) {
(my $path = $pkg) =~ s{::}{/}g;
require "$path.pm";
$pkg->process;
...
}
当然,修改假设是例如$_
的形式。Processors::Foo
即使你不能修改你的内容@data
,我认为你可以生成处理器的名称,以便你能够调用它的process()
方法。
如果您想炫耀,您可以创建一个Factory
对象,该对象将根据以下值返回处理器实例$_
:
package Processors::Factory;
sub get_instance{
my ($self, $processor_name) = @_;
my $full_processor_name = sprintf('Processors::%s', ucfirst($processor_name) );
(my $full_processor_path = $full_processor_pkg) =~ s{::}{/}g;
require "$full_processor_path.pm";
my $processor = $full_processor_name->new();
return $processor;
}
1;
然后,您的代码将如下所示:
#!/usr/bin/perl -w
use strict;
use Processors::Factory;
foreach (@data) {
Processors::Factory->get_instance( $_ )->process();
...
}