Библиотека для создания кода сокращения с использованием определенных правил - PullRequest
0 голосов
/ 15 июля 2011

Существует ли библиотека CPAN, способная создавать кодовые ссылки из структурированного ввода базовых тестов, которые уменьшают переданную структуру данных до значения true / false? он должен быть в состоянии отобразить переданные атрибуты из конструктора на атрибуты переданной структуры данных (то есть в приведенном ниже примере [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 голосов
/ 15 июля 2011

Ничего об этой проблеме, да и вообще, ваш пример кода не требует решения кода по мне; вы, скорее всего, найдете подпрограмму, которая принимает как определение, так и элемент для проверки в качестве параметров.

Я знаю, что есть несколько таких; первое, что приходит на ум, это 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;
        }
    }
}
...