質問

次の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";
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top