處理彼此使用的模塊的最佳方式是什麼?處理彼此使用模塊的最佳方式是什麼?
比方說,我有這對於哈希函數模塊:已分割出的名單
# 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