Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Трабла с print в цикле


Автор: Perl_sapiens 4.3.2008, 00:01
Вот некий код:
Код

# это только пример кода, но суть не меняется
foreach $x (@list) {
print ".";
    foreach $x2 (@list2) { 
        $x=~ s/\n//;
        $x2=~s/\n//;
        print  "\n$x - $x2\n";
    }
}

В краце, суть кода такая: выводить ".", которые символизируют работу скрипта. Но вот трабла в том, что они не выводятся, пока не будет выведен символ \n. По идее так не должно быть, но это факт.

Скажите, в чем может быть проблема?

Автор: KSURi 4.3.2008, 00:51
Код

$| = 1;

Попробуйте добавить это в начало скрипта

Автор: shamber 4.3.2008, 09:44
Цитата(Perl_sapiens @  4.3.2008,  00:01 Найти цитируемый пост)
Скажите, в чем может быть проблема?


Буферизация.

Автор: Perl_sapiens 4.3.2008, 13:59
KSURi, а что эта переменная делает?

Автор: shamber 4.3.2008, 14:22
Ссоори , что не KSURi smile
Буферизацию отключает smile

Автор: KSURi 4.3.2008, 15:47
Данные выводятся не сразу по поступлению в специальный буфер, а накапливаются там и выводятся порциями.
Чтобы отключить данную особенность, можно "взвести" специальную переменную:
(perldoc perlvar)

Цитата

HANDLE->autoflush(EXPR)
$OUTPUT_AUTOFLUSH
$|
    If set to nonzero, forces a flush right away and after every write or print on the currently selected output channel. Default is 0 (regardless of whether the channel is really buffered by the system or not; $| tells you only whether you've asked Perl explicitly to flush after each write). STDOUT will typically be line buffered if output is to the terminal and block buffered otherwise. Setting this variable is useful primarily when you are outputting to a pipe or socket, such as when you are running a Perl program under rsh and want to see the output as it's happening. This has no effect on input buffering. See getc in the perlfunc manpage for that. (Mnemonic: when you want your pipes to be piping hot.)


P.S.: еще можно воспользоваться ф-ями sysread/write, которые работают в обход стандартной буферизации, но делать этого не стоит, если вы не уверены в том, что вам это действительно нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)