Перекрестная публикация от perlmonks:
Мне нужно очистить какой-то грубый, древний код на $ work, и прежде чем я попытаюсь создать новый модуль, я хотел бы использовать существующий, если кто-нибудь знаетчего-то подходящего.
Во время выполнения я анализирую файл, чтобы определить, какую обработку мне нужно выполнить для набора данных.
Если бы я написал модуль, я бы попытался сделать это более обобщенно (не-DBI-специфичный), но мой точный вариант использования таков:
Я читаю файл SQL, чтобы определить запрос для выполнения к базе данных.Я анализирую комментарии вверху и определяю, что
- столбец A должен иметь как /// примененный,
- столбец B должен быть преобразован, чтобы выглядеть как дата данного формата,
- столбец C получает вид tr ///.
- Кроме того, можно связать цепочку, чтобы столбец D мог ///, а затем сказать, если это не 1 или 2, установитьдо 3.
Так что при извлечении из базы данных программа применяет различные (возможно, суммированные) преобразования перед возвратом данных.
В настоящее время код представляет собой отвратительно большой и сложный рядиз if if обработки ужасно трудно читать или поддерживать массивы инструкций.
Итак, я представляю себе объект, который, возможно, будет анализировать эти строки (и дополнительно предоставлять функциональный интерфейс), составлять список применяемых процессоров, а затем сможет выполнять его на переданном фрагменте.данные.
Опционально может быть опция имени / категории, чтобы один объект мог динамически использоваться для объединения процессоров только для заданного имени / категории / столбца.
Традиционно надуманный пример:
$obj = $module->new();
$obj->parse("-- greeting:gsub: /hi/hello"); # don't say "hi"
$obj->parse("-- numbers:gsub: /\D//"); # digits only
$obj->parse("-- numbers:exchange: 1,2,3 one,two,three"); # then spell out the numbers
$obj->parse("-- when:date: %Y-%m-%d 08:00:00"); # format like a date, force to 8am
$obj->stack(action => 'gsub', name => 'when', format => '/1995/1996/'); # my company does not recognize the year 1995.
$cleaned = $obj->apply({greeting => "good morning", numbers => "t2", when => "2010116"});
Каждый процессор (gsub, date, exchange) будет отдельной подпрограммой.Плагины могут быть определены, чтобы добавить больше по имени.
$obj->define("chew", \&CookieMonster::chew);
$obj->parse("column:chew: 3x"); # chew the column 3 times
Итак, первый очевидный вопрос: кто-нибудь знает модуль, который я мог бы использовать?Единственное, что мне удалось найти, это [mod: // Hash :: Transform], но, поскольку я буду определять, какую обработку выполнять динамически во время выполнения, я бы всегда в конечном итоге использовал бы «сложный» вариант, и мне все равно придется собирать парсер / укладчик.
Кто-нибудь знает о каких-либо подобных модулях или даже слегка связанных модулях, которые я мог бы использовать / обернуть?
Если нет ничего общего для общественного потребления (конечно, мой не единственный в темном ящике), есть ли у кого-нибудь какие-либо советы по поводу вещей, о которых следует помнить, или по поводу интерфейсов, и даже по другим возможным причинам, помимо использованиявозврат данных из DBI, Text :: CSV и т. д.?
Если я закончу писать новый модуль, есть ли у кого-нибудь предложения по пространству имен?Я думаю, что что-то в Data ::, вероятно, уместно ... слово «pluggable» приходит на ум, потому что мой пример использования напоминает мне PAM, но у меня действительно нет хороших идей ...
- Data :: Processor :: Pluggable?
- Data :: Munging :: Configurable?
- I :: Chew :: Data?