解析文件和构建输出的正确方法

时间:2016-07-14 12:32:02

标签: file d string-interpolation

我正在努力学习D,我想在做了hello world之后,我可以尝试用Java之前想做的事情,因为Regex API的工作方式,这是一个很大的痛苦:一个小模板发动机。 所以,我开始使用一些简单的代码来逐个字符地读取文件:

import std.stdio, std.file, std.uni, std.array;

void main(string [] args) {

    File f = File("src/res/test.dtl", "r"); 

    bool escape = false;
    char [] result;
    Appender!(char[]) appender = appender(result);

    foreach(c; f.rawRead(new char[f.size])) {
        if(c == '\\') {
            escape = true;
            continue;
        }
        if(escape) {
            escape = false;
            // do something special
        }
        if(c == '@') {
            // start of scope
        }
        appender.put(c);
    }
    writeln(appender.data());
}

我的文件内容可能是这样的:

 <h1>@{hello}</h1>

目标是用传递给引擎的某个值替换@ {hello}部分。

所以,我实际上有两个问题: 1.这是处理D中文件中字符的好方法吗?在搜索了所有导入的模块并选择听起来像它可能完成工作的内容之后,我一起攻击了这个。 2.有时,我想要访问多个字符(以改进对转义序列的检查,找到整个范围等等。我应该为此切片吗?或者D的正则表达式是否能够应对这一挑战?到目前为止,我只找到matchFirst和matchAll方法,但我想匹配,替换并返回到那个位置。怎么可能这样做?

1 个答案:

答案 0 :(得分:1)

D标准库不提供您所需的功能。您需要的是&#34; string interpolation&#34;,这是D中非常好的实现,您可以按照您描述的方式使用:https://github.com/Abscissa/scriptlike/blob/4350eb745531720764861c82e0c4e689861bb17e/src/scriptlike/core.d#L139

以下是关于此库的博文:https://p0nce.github.io/d-idioms/#String-interpolation-as-a-library