1

我需要知道是否可以将通过 stdin 输入的每个单词迭代到使用 JavaScript 的程序中。如果是这样,我可以得到有关如何做到这一点的任何线索吗?

4

2 回答 2

2

使用节点

var stdin = process.openStdin();
var buf = '';

stdin.on('data', function(d) {
    buf += d.toString(); // when data is received on stdin, stash it in a string buffer
                         // call toString because d is actually a Buffer (raw bytes)
    pump(); // then process the buffer
});

function pump() {
    var pos;

    while ((pos = buf.indexOf(' ')) >= 0) { // keep going while there's a space somewhere in the buffer
        if (pos == 0) { // if there's more than one space in a row, the buffer will now start with a space
            buf = buf.slice(1); // discard it
            continue; // so that the next iteration will start with data
        }
        word(buf.slice(0,pos)); // hand off the word
        buf = buf.slice(pos+1); // and slice the processed data off the buffer
    }
}

function word(w) { // here's where we do something with a word
    console.log(w);
}

处理 stdin 比简单的字符串复杂得多,split因为 Node 将 stdin 呈现为 a Stream(它将输入数据块作为Buffers 发出),而不是字符串。(它对网络流和文件 I/O 做同样的事情。)

这是一件好事,因为标准输入可以任意大。考虑一下如果您将一个数 GB 的文件通过管道传输到您的脚本中会发生什么。如果它首先将标准输入加载到一个字符串中,它首先会花费很长时间,然后当你用完 RAM(特别是进程地址空间)时会崩溃。

通过将标准输入作为流处理,您能够以良好的性能处理任意大的输入,因为您的脚本一次只处理小块数据。缺点显然是增加了复杂性。

上面的代码适用于任何大小的输入,并且如果单词在块之间被切成两半,则不会中断。

于 2012-07-27T23:27:22.103 回答
1

假设您使用的环境具有console.log并且标准输入是字符串,那么您可以执行此操作。

输入:

var stdin = "I hate to write more than enough.";

stdin.split(/\s/g).forEach(function(word){
    console.log(word)
});

输出:

I
hate
to
write
more
than
enough.
于 2012-07-27T22:56:07.780 回答