1

以下のコードにp00は、で作成された名前付きパイプがありmkfifo p00ます。

コンソール1で、次のコマンドを実行しました。

% perl -ne 'print "PERL: $_"' < p00

次に、上記が(予想どおりに)ブロックされている間に、コンソール2で実行しました

% seq 3 > p00

その結果、コンソール1に次のように表示されました。

PERL: 1
PERL: 2
PERL: 3
%

これは、3行目を印刷した後にスクリプトが終了したという事実を除いて、私が達成したいと思っていた結果とほぼ同じでした。perl

スクリプトは、行が利用可能になるとすぐに(接頭辞「PERL:」で始まる)行をエコーし​​続け、それ以外の場合はブロックするようにします。

上記のワンライナーの次のバリエーションは、表面的には目的の動作に似ています。

perl -e 'while ( 1 ) { print "PERL: $_" while <>; sleep 1 }' < p00

...しかし、入力を待っている間はブロックせず、入力が利用可能になるとすぐにエコーするため、これは実際の取引ではありません。

ノート:

  1. この質問の背後にある動機は教育(つまり私のもの)であり、それ以上のものではありません。私は実際的な問題を解決しようとはしていません。私はもっ​​とperl(そしてunix)を学ぼうとしています。
  2. この質問がunix.se.comに適しているかどうかはわかりませんでした。もしそうなら、私はそれをそこに再投稿することをとてもうれしく思います。私に知らせて。
4

1 に答える 1

1

Maxim Yegorushkinのコメントを読んだ後、私がしなければならなかったsleep 1のは2番目のバージョンでを取り除くことだけであることに気づきました。つまり、これはまさに私が望むことを行います:

perl -e 'while ( 1 ) { print "PERL: $_" while <> }' < p00

マキシムが書いたように、内側のループはEOF;を受信すると終了します。次に、外側のループがスクリプトをブロック状態に戻し、入力を待機します... Doh!

于 2012-04-13T01:22:25.453 に答える