2011-07-15 4 views
0

渡されたデータ構造を真偽値に減らす基本テストの構造化入力からコード参照を作成できる既存のCPANライブラリはありますか?コンストラクタから渡された属性を渡されたデータ構造体の属性にマップする必要があります(例:[attribute => 'something']は、渡されたスカラーの$_->{something}にマップされます)。定義済みの規則を使用してリダクションコードリーダを作成するライブラリ

私は何かを書くことができましたが、私はそれを処理するためにCPANで何も見つけられません。本当に驚いています。誰かがこの種のことをするライブラリを知っていますか?

my @def = ([ [ attribute => 'something' ], '>', 50 ], 
      'and', 
      [ [ attribute => 'something_else' ], 'eq', 'match' ], 
     ); 

my $coderef = Reducer->new(@def); 

my @items = ({ something => 75, 
       something_else => 'match', 
       }, 
       { something => 20, 
       something_else => 'match', 
       }, 
       { something => 75, 
       something_else => 'no match', 
       }, 
       { something => 90, 
       something_else => 'match', 
       }, 
      ); 

for my $item (@items) { 
    $coderef->($item) ? say 'true' : say 'false'; 
}; 

出力:この問題または約

true 
false 
false 
true 

答えて

0

何も実際にあなたの例のコードは、私にはコードリファレンスが解決しようとする叫びます。定義と項目の両方をパラメータとして検証するサブルーチンを見つける可能性が高くなります。

私はそれらのいくつかがあることを知っています。最初に気になるものはParams::Validate::validateです。

定義構造はあなたのもの(属性のハッシュ、配列の代わりに検証仕様など)とは異なりますが、その周りにあなたの望むインタフェースをラップするのは簡単です。

package Params::Validate::Reducer; 
use strict; 
use warnings; 
use Params::Validate(); 
sub new { 
    my ($class, $def) = @_; 
    sub { 
     !! eval { 
      Params::Validate::validate(@_, $def); 
      1; 
     } 
    } 
} 
+0

私はコンパイルコードリファレンスに傾いた唯一の理由は、プログラムの生活の上にそれらに対して実行する多くのチェックと、比較的少数のルールがあるように予定されていることである、と私は解釈していないようにするために期待していましたそれが何かチェックされるたびにルール参照。しかし早すぎる最適化であるかもしれません、そして、私はその考えを断っても構いません。比較のためだけに、あなたが推奨するその他の検証モジュールは何ですか? – Oesor

+0

私はいくつかの他のもの(それらを使用する無関係なコードで配布されることが多い)を見たことがあるのは分かっていますが、私はそれを思い出すことができません。 Params :: Validateは確かにスピードデーモンではなく、 "グローバルオプション"インターフェースはIMOが本当にうまく設計されていないので、自分で構想したコンパイルされたコードレコーダーを作成することをお勧めします。 – ysth

+0

ええ、Params :: Validate PODをスキミングした後、私はそれに向かって傾いています。これが本当に扱うべきことは、 'if(scalar @ {$ _}> 10)'や 'if((uniq map {$ _->)}}のようなもので任意の配列参照を見るためにconfigから定義できることです。 {foo}} @ $ _)<3) 'などと、コールバックを実行するためにtrueを評価する場合です。私はちょうど私がそれをするためにプラグインする何かを見つけていない驚いています。 – Oesor

関連する問題