require
@pilcrowが言ったように、代わりにを使用することでこの問題をすばやく解決できますが、これはポリモーフィズム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();
...
}