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
4

1 回答 1

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;
        }
    }
}
于 2011-07-15T16:48:02.113 回答