1

JavaScriptを使用してstdinを介してプログラムに入力されたすべての単語を反復処理できるかどうかを知る必要があります。もしそうなら、私はそうする方法について何かリードを得ることができますか?

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を文字列ではなく(着信データのチャンクをsとして出力する)splitとして提示するため、stdinの処理は単純な文字列よりもはるかに複雑です。(ネットワークストリームとファイルI / Oでも同じことをします。)StreamBuffer

stdinは任意に大きくできるため、これは良いことです。マルチギガバイトのファイルをスクリプトにパイプした場合にどうなるかを考えてみてください。最初にstdinを文字列にロードした場合、最初に長い時間がかかり、RAM(具体的にはプロセスアドレス空間)が不足するとクラッシュします。

stdinをストリームとして処理することにより、スクリプトは一度に小さなデータチャンクしか処理しないため、任意の大きな入力を優れたパフォーマンスで処理できます。欠点は明らかに複雑さが増すことです。

上記のコードは任意のサイズの入力で機能し、単語がチャンク間で半分に切り刻まれても壊れません。

于 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 に答える