单通道文件扫描

时间:2013-09-20 10:02:37

标签: d monads higher-order-functions fileparsing

在我的文件扫描D程序中,我正在实现一个逻辑,用于查找关键字符串集的所有命中以及类似于Grep的行和列上下文。

我当前的算法通过调用find直到文件结束。当发现命中时,我向后和向前搜索以检测命中行的开始和结束的字节偏移。然后我再次向后搜索,找到文件开头和我的命中开始偏移之间的换行符数。这当然不是一个高效而不优雅的解决方案,但它目前有效并且有助于理解我如何操作切片。

我现在想重构这段代码,以便使用状态机(Monads)的一些组合,它们只需要抛出一次文件,然后更新并运行到目前为止找到的一系列行启动({{1} })。 size_t[]应该基于这样的解决方案?此算法应输出一个元组数组,其中每个元组包含一个命中切片,bol / eol-slice和行号。

1 个答案:

答案 0 :(得分:2)

迭代所有行并保持当前行号

更简单,更容易
foreach(n, line; lines(file))
{
    auto index = indexOf(line,needle);
    if(index>=0){
        writeln(n, ", ", index);
    }
}