質問
次のPerlコードがあります:
STDOUT->autoflush(1);
foreach(...)
{
...
foreach(...)
{
print("Processing $folder");
$|=1;
process($folder);
}
...
}
ただし、printステートメントはループの最初の反復でのみ機能し、その後は何も出力しません。理由は何ですか?
編集:理由を見つけて、回答にも追加しました。 解決策は次のとおりです。
次の行を ループして動作しました:
STDOUTを選択;
process()関数のコードだと思います デフォルトを変更していたはずです 出力バッファ。書かれたコードでした 他の誰かによって!
これが問題かどうかわかりません これを許可するPerl 元に戻さなかった開発者 デフォルトに。
最終的なコードは次のようになりました:
foreach(...) { ... foreach(...) { select STDOUT; print("Processing $folder"); $|=1; process($folder); } ... }
ありがとうございます...
解決
この問題を追跡するための優れた探偵の仕事!
別の解決策を提案したい。
process()
の作成者と select()
warを使用する代わりに、 IO :: Handle STDOUTへのインターフェース:
use IO::Handle;
foreach(...)
{
...
foreach(...)
{
STDOUT->printflush("Processing $folder");
process($folder);
}
...
}
他のヒント
ループ内に次の行を追加し、機能しました:
select STDOUT;
process()関数のコードはデフォルトの出力バッファーを変更しているはずです。それは他の誰かによって書かれたコードでした!
これがPerlの問題なのか、これを許可するのか、デフォルトに戻さなかった開発者の問題なのかわかりません。
最終的なコードは次のようになりました:
foreach(...)
{
...
foreach(...)
{
select STDOUT;
print("Processing $folder");
$|=1;
process($folder);
}
...
}
ありがとうございます...
私のコードは次のようになります:
#!/usr/bin/perl -w
use strict;
use warnings;
use sigtrap qw/handler signal_handler normal-signals/;
use feature qw(say);
my $datetime;
$datetime = localtime ();
say "tester started $datetime";
while ( 1 ) {
select STDOUT;
$datetime = localtime ();
say "tester output every second $datetime";
$|=1;
sleep ( 1 );
}
sub signal_handler {
die "\nCaught a signal $!\n";
}
所属していません StackOverflow