我需要知道是否可以使用JavaScript将通过stdin输入的每个单词迭代到程序中。如果是这样,我可以获得如何做的任何线索吗?
答案 0 :(得分:2)
使用Node:
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表示为Stream
(它将传入数据的块发送为Buffer
s),而不是字符串。 (它对网络流和文件I / O做了同样的事情。)
这是一件好事,因为stdin可以任意大。考虑一下如果您将一个数千兆字节的文件传入您的脚本会发生什么。如果它首先将stdin加载到字符串中,它将首先花费很长时间,然后在RAM耗尽(特别是进程地址空间)时崩溃。
通过将stdin作为流处理,您可以处理具有良好性能的任意大量输入,因为您的脚本一次只处理小块数据。不利因素显然增加了复杂性。
以上代码适用于任何大小的输入,如果一个单词在块之间被切成两半,则不会中断。
答案 1 :(得分:0)
假设您使用的是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.