5

次の 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);
    }
    ...
}

皆さんありがとう...

4

3 に答える 3

11

この問題を追跡するための優れた探偵の仕事!

別の解決策を提案したいと思います。

select()の作成者と戦争をするのではなく、STDOUTへのIO::Handleprocess()インターフェイスを使用できます。

use IO::Handle;

foreach(...)
{
    ...

    foreach(...)
    {
        STDOUT->printflush("Processing $folder");

        process($folder);
    }
    ...
}
于 2009-08-03T23:38:19.810 に答える
5

ループ内に次の行を追加したところ、機能しました。

select STDOUT;

process() 関数のコードは、デフォルトの出力バッファを変更するべきだったと思います。それは他の誰かによって書かれたコードでした!

これがこれを許可する Perl の問題なのか、それともデフォルトに戻さなかった開発者の問題なのかはわかりません。

最終的なコードは次のようになります。

foreach(...)
{
    ...

    foreach(...)
    {
        select STDOUT;

        print("Processing $folder");
        $|=1;
        process($folder);
    }
    ...
}

皆さんありがとう...

于 2009-08-03T11:34:48.013 に答える
0

私のコードは次のようになります。

#!/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";
}
于 2016-06-10T12:26:24.697 に答える