处理彼此使用的模块的最佳方式是什么?处理彼此使用模块的最佳方式是什么?
比方说,我有这对于哈希函数模块:已分割出的名单
# Really::Useful::Functions::On::Hash.pm
use base qw<Exporter>;
use strict;
use warnings;
use Really::Useful::Functions::On::List qw<transform_list>;
our @EXPORT_OK = qw<transform_hash transform_hash_as_list ...>;
#...
sub transform_hash { ... }
#...
sub transform_hash_as_list {
return transform_list(%{ shift() });
}
#...
1
而另一个模块:
# Really::Useful::Functions::On::List.pm
use base qw<Exporter>;
use strict;
use warnings;
use Really::Useful::Functions::On::Hash qw<transform_hash>;
our @EXPORT_OK = qw<transform_list some_func ...>;
#...
sub transform_list { ... }
#...
sub some_func {
my %params = transform_hash @_;
#...
}
#...
1
假设足够的这些实用功能足够方便我希望在BEGIN语句和导入函数中使用它们来处理参数列表或配置数据。
我一直在将子定义放入BEGIN块以确保它们随时可以使用,只要有人包含该模块。但是我已经进入了毛病的比赛条件,在BEGIN块中没有完成定义。
我将不断演变的代码习惯用法放入模块中,以便我可以重复使用任何习惯用法,我发现自己一次又一次地编码。例如:
sub list_if {
my $condition = shift;
return unless $condition;
my $more_args = scalar @_;
my $arg_list = @_ > 1 ? \@_ : @_ ? shift : $condition;
if ((reftype($arg_list) || '') eq 'ARRAY') {
return wantarray ? @$arg_list : $arg_list;
}
elsif ($more_args) {
return $arg_list;
}
return;
}
捕捉这两种习惯用法,我是有点累打字:
@{ func_I_hope_returns_a_listref() || [] }
和
($condition ? LIST :())
我越在定义函数BEGIN块,越有可能我将使用这些成语砖来表达逻辑,BEGIN块中需要更多砖块。
人们是否有处理这种语言成语砖模型的标准方法?
我一直在做的主要是Pure-Perl; XS是否会缓解一些呢?
替补在编译时被加载,无论它们是否在BEGIN块。你可以展示一个你需要在BEGIN块中定义的函数的例子吗? – mob 2010-06-16 15:58:19
@mobrule:或许我不需要把它们放在BEGIN块中,但这就是工作,使用修补程序,直到你没有一个“解决”问题的错误方法。当我试图积累越来越多的这些成语砖以逐步提高编码和测试的速度时,哪种激励了长期存在的问题。 – Axeman 2010-06-16 16:16:19