在我的文件扫描D程序中,我正在实现一个逻辑,用于查找关键字符串集的所有命中以及类似于Grep的行和列上下文。
我当前的算法通过调用find
直到文件结束。当发现命中时,我向后和向前搜索以检测命中行的开始和结束的字节偏移。然后我再次向后搜索,找到文件开头和我的命中开始偏移之间的换行符数。这当然不是一个高效而不优雅的解决方案,但它目前有效并且有助于理解我如何操作切片。
我现在想重构这段代码,以便使用状态机(Monads)的一些组合,它们只需要抛出一次文件,然后更新并运行到目前为止找到的一系列行启动({{1} })。 size_t[]
应该基于这样的解决方案?此算法应输出一个元组数组,其中每个元组包含一个命中切片,bol / eol-slice和行号。
答案 0 :(得分:2)
迭代所有行并保持当前行号
更简单,更容易foreach(n, line; lines(file))
{
auto index = indexOf(line,needle);
if(index>=0){
writeln(n, ", ", index);
}
}