1

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

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

我现在想重构此代码以使用状态机(Monads)的某种组合,它只需要抛出一次文件,并且更新和操作到目前为止找到的行开始数组(size_t[])。std.algorithm这样的解决方案应该基于什么?该算法应该输出一个元组数组,其中每个元组包含一个命中切片、bol/eol 切片和行号。

4

1 回答 1

2

遍历所有行并保留当前行号要简单得多

foreach(n, line; lines(file))
{
    auto index = indexOf(line,needle);
    if(index>=0){
        writeln(n, ", ", index);
    }
}
于 2013-09-20T10:25:48.550 回答