正如@pilcrow說,你可以快速通過require
代替use
解決這個問題,但非常感謝,我覺得這是一個很好的例子Polymorphism被使用。
您可以創建一個基類,如:
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();
...
}
在你的情況下,並不需要'use',而是使用'require'。 – pilcrow
@pilcrow +1爲精彩的措辭,好先生。 –
是否添加太多的打字編寫'美孚::過程(...)'和'欄::過程(...)'。雖然我很喜歡都鐸王朝的多態示例,但它不一定比'使用Foo()'更難。富::過程()'。如果該模塊使用「出口商」來管理其出口,則空列表讓它知道我們不需要出口。 – Axeman