2017-02-16 5 views
1

私はPerlを使ってかなり簡単な処理をしようとしています。コードのスニペット:しばらく()が呼び出されたときパイプを開いてPerlで出力を解析するのに遅延が発生する

open(FH,"<command> |") or die "Could not run command .. $!\n"; 

print "After open\n"; 

while(<FH>) 
{ 
    print "I am inside loop\n"; 
    <process..something> 
} 

私はいくつかの不可解な遅延を見ています。私は開いている(範囲内にある)を実行するには9-10ミリメートルを取ることがわかりますが、私は "オープン後"と "私は内部ループです"というメッセージの間に200〜250ミリ秒の遅延が見られます。

誰もこのようなことを見たことがありますか?どんな助けもありがとう。

おかげ ラジブ

+1

「_command_」は何を実行していますか? ' 'で何かが読み取られたときに' while'の中に入るので、 '_command_"がやっていることに完全に依存します。 2秒間スリープしてから印刷すると、 'while()'が2秒間そこに座ります。 – zdim

+1

字句ファイルハンドル( 'my $ fh')と3つの引数' open'が推奨されます。 – zdim

+0

私はデータベース・コマンドdb2pd -db -activeを実行していますが、その出力は(プログラムの外で試してみると)かなり瞬時に起こります。 – rssarkar

答えて

1

<コマンドからの出力>は、バッファがいっぱいになるか、プロセスが

を終了するまで、あなたはおそらくunbufferを使用してこの問題を回避することができますバッファリングされているので、これは、ほぼ確実にこれは端末に出力しているコマンドのふりをします

代わりにこれを試してください

open my $fh, '-|', 'unbuffer <command>' or die "Could not run command: $!\n"; 
+0

ありがとうたくさんの人。私は本当にすべての助けに感謝します。 zdimがopen()の3つのオプション形式を使用した後、時間は150〜160msになりましたが、Borodinのコマンドを使用すると30〜35msになりました!! – rssarkar

+0

最後に使用したコードは、 open $ FH、 ' - |'、 'unbuffer db2pd -db $ db -active 2>/dev/null'またはdie "コマンドを実行できませんでした.. $!\ n "; 2:/ dev/nullを使用して、ログファイルにsh:unbuffer not foundエラーメッセージを削除しました。 もう一度すべてのヘルプをありがとうございます。 – rssarkar

+0

@rssarkar:そうは思わない。 ***から***の代わりに***の***にパイプをオープンしています。あなたは 'unbuffer not found'メッセージを受け取るべきではありません。あなたのシステムは 'unbuffer'を持っていますか? – Borodin

関連する問題