相互に使用するモジュールを処理する最良の方法は何ですか?
ハッシュの関数を持つモジュールがあるとしましょう:
# 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;
}
タイプするのにちょっとうんざりしている 2 つのイディオムをキャプチャします。
@{ func_I_hope_returns_a_listref() || [] }
と
( $condition ? LIST : ())
BEGIN ブロックで関数を定義すればするほど、これらのイディオム ブリックを使用してロジックを表現する可能性が高くなり、BEGIN ブロックでブリックが必要になる可能性が高くなります。
人々は、この種の言語イディオム ブリック モデルを扱う標準的な方法を持っていますか?
私は主に Pure-Perl を使ってきました。XSはこれをいくらか緩和しますか?