关于如何在单个文件中构建调度表并通过它调用函数,您已经得到了一些很好的答案,但您还一直在谈论希望在其他模块中定义函数。如果是这种情况,那么根据每个模块所说的可调度功能动态构建调度表,而不是担心手动更新它不是更好吗?当然会!
当然,演示这需要多个文件,我正在使用CPAN 中的Module::Pluggable来查找提供函数定义的模块。
dispatch_core.pl:
#!/usr/bin/env perl
use strict;
use warnings;
my %dispatch;
use lib '.'; # a demo is easier if I can put modules in the same directory
use Module::Pluggable require => 1, search_path => 'DTable';
for my $plugin (plugins) {
%dispatch = (%dispatch, $plugin->dispatchable);
}
for my $func (sort keys %dispatch) {
print "$func:\n";
$dispatch{$func}->(2, 5);
}
DTable/Add.pm:
package DTable::Add;
use strict;
use warnings;
sub dispatchable {
return (add => \&add);
}
sub add {
my ($num1, $num2) = @_;
print "$num1 + $num2 = ", $num1 + $num2, "\n";
}
1;
DTable/MultDiv.pm:
package DTable::MultDiv;
use strict;
use warnings;
sub dispatchable {
return (multiply => \&multiply, divide => \÷);
}
sub multiply {
my ($num1, $num2) = @_;
print "$num1 * $num2 = ", $num1 * $num2, "\n";
}
sub divide {
my ($num1, $num2) = @_;
print "$num1 / $num2 = ", $num1 / $num2, "\n";
}
1;
然后,在命令行上:
$ ./dispatch_core.pl
add:
2 + 5 = 7
divide:
2 / 5 = 0.4
multiply:
2 * 5 = 10
现在添加新函数就像使用适当的dispatchable
子目录将新文件拖放到 DTable 目录中一样简单。无需触摸dispatch_core.pl
即可再次添加新功能。
编辑:针对评论中关于是否可以在没有 Module::Pluggable 的情况下完成此操作的问题,这里有一个修改后的 dispatch_core.pl,它不使用除定义可调度函数的模块之外的任何外部模块:
#!/usr/bin/env perl
use strict;
use warnings;
my %dispatch;
my @dtable = qw(
DTable::Add
DTable::MultDiv
);
use lib '.';
for my $plugin (@dtable) {
eval "use $plugin";
%dispatch = (%dispatch, $plugin->dispatchable);
}
for my $func (sort keys %dispatch) {
print "$func:\n";
$dispatch{$func}->(2, 5);
}