来自 perlmonks 的交叉发布:
我必须在 $work 上清理一些粗糙的、古老的代码,在我尝试制作一个新模块之前,如果有人知道合适的东西,我很乐意使用现有的模块。
在运行时,我正在解析一个文件以确定我需要对一组数据进行哪些处理。
如果我要编写一个模块,我会尝试更通用(非 DBI 特定),但我的确切用例是这样的:
我阅读了一个 SQL 文件来确定要对数据库运行的查询。我解析顶部的评论并确定
- A 列需要有 as/// 应用,
- B 列需要转换为给定格式的日期,
- C 列得到一种 tr///。
- 此外,可以链接事物,以便 D 列可能 s///,然后说如果它不是 1 或 2,则将其设置为 3。
因此,当从数据库中获取数据时,程序会在返回数据之前应用各种(可能是堆叠的)转换。
目前,代码是一系列令人作呕的大而困难的 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],但由于我将确定在运行时动态执行哪些处理,所以我总是最终使用“复杂”选项,我d 仍然需要构建解析器/堆栈器。
有人知道我可能想要使用/包装的任何类似模块甚至是轻度相关的模块吗?
如果没有什么通用的可供公众消费(当然我的不是暗盘中唯一的),除了从 DBI 返回数据之外,是否有人对要记住的事情或接口建议或什至其他可能的用途有任何建议,文本::CSV 等?
如果我最终编写了一个新模块,是否有人有命名空间建议?我认为 Data:: 下的某些内容可能是合适的......“可插拔”这个词一直在脑海中浮现,因为我的用例让我想起了 PAM,但我真的没有什么好主意......
- 数据::处理器::可插拔?
- 数据::Munging::可配置?
- 我::咀嚼::数据?