Вопрос

У меня есть следующий код 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);
    }
    ...
}
     

Спасибо всем ...

Это было полезно?

Решение

Хорошая детективная работа по выявлению этой проблемы!

Я хотел бы предложить альтернативное решение.

Вместо того чтобы воевать select () с автором process () , вы можете использовать IO :: Handle интерфейс для STDOUT:

use IO::Handle;

foreach(...)
{
    ...

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

        process($folder);
    }
    ...
}

Другие советы

Я добавил следующую строку в цикл, и это сработало:

select STDOUT;

Я думаю, что функция code in 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