处理相互使用的模块的最佳方法是什么?
假设我有一个具有哈希函数的模块:
# 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会减轻一些吗?