2016-05-11 12 views
0

私はWindowsで実行しているperlスクリプトを持っています。スクリプトでは別のperlスクリプトを呼び出します。私はこれらのスクリプトを両方ともcmdウィンドウとファイルに出力しようとしています。この基本的にはどのように私は、コール画面とファイルへのメッセージの印刷

using IO::Tee 
    open (my $file, '>>', "C:\\Logs\\logfile.txt") or die "couldn't open log file: $!"; 
    me $tee = IO::Tee->new(\*STDOUT, $file); 
    # doing some stuff 
    print $tee "log about what i just did"; 
    # do more stuff 
    print $tee "more logs"; 
    print $tee `c:\\secondScript.pl arg1`; 
    print $tee "done with script"; 

をやっている2番目のスクリプトは、基本的に

# do stuff 
    print "script 2 log about stuff"; 
    # do more stuff 
    print "script 2 log about more stuff"; 
    print "script 2 done"; 

これは画面にすべてとファイルを取得しています。しかし、スクリプト2が終了するまで、「スクリプト2のログ」、「スクリプト2のログの詳細」、「スクリプト2の完了」は表示されません。プリントに達するとすぐに、そのストリームのすべてを画面とファイルに表示したいと思います。 STDOUTへ

+4

2番目のスクリプトで出力バッファリングをオフにしてみます。 '$ | = 1; –

答えて

2

印刷はラインがバッファリング通常(物事をスピードアップするために)出力が端末に行き、ブロックがそうでなければをバッファリングする場合(例えば、出力をファイルにリダイレクトする場合)。
印刷されたものが最初にバッファに格納され(通常は4096バイト)、バッファがいっぱいになる(4096文字が印刷された)場合にのみ、スクリーンに出力されるように考えることができます。

ラインバッファーは、出力が\nが見つかった(またはバッファーが使い果たされた)後にのみ画面に表示されることを意味します。 2番目のスクリプトには\nがありません。したがって、a)\nが来るか、b)バッファがいっぱいか、またはc)スクリプトが終了するまで、出力が表示されません。

ブロックバッファは、バッファがいっぱいになったときだけ出力が表示されることを意味します。 \nはここには影響しません(1文字として数えます)。

バッファリングを避けるには、という魔法の変数と呼ばれる$|があります。ゼロ以外に設定

場合は、すぐに、現在選択されている出力チャネル上のすべての書き込みや 印刷後にフラッシュを強制的に:docsから($|セクションまでスクロールします)。より良い - -

だから、あなたはprint文やへ"\n"を追加することができ、あなたの第二スクリプトの先頭に$| = 1;を設定する(一度だけではなく、各printのため)。これは2番目のスクリプトの出力を(理論的には)遅くしますが、いくつかの行については何の違いもありません。

関連する問題