库使用定义的规则创建缩减代码

时间:2011-07-15 16:32:26

标签: perl object reduce

是否有现有的CPAN库能够从基本测试的结构化输入创建coderefs,将传递的数据结构减少为真/假值?它需要能够将构造函数中传递的属性映射到传递的数据结构的属性(即,在下面的示例中[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

1 个答案:

答案 0 :(得分:0)

没有任何关于这个问题或者你的示例代码吵到要通过coderef来解决;您更有可能找到一个子程序,它将定义和项目都作为参数进行验证。

我知道其中有几个;首先想到的是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;
        }
    }
}