|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Eugen J. Sobchenko 2:5020/400 20 Oct 2002 02:00:20 To : All Subject : в чем собственно ра зница?! --------------------------------------------------------------------------------
Приветствую читателей.
Давеча наткнулся на проблему объяснение которой не смог найти.
Пишу программу, читающую из fifo и или как "tail -f" из простого
файла построчно. Складываю поступившие строки в @strings и обрабатываю их
по очереди.
Сначала подумал, что лучше будет читать read'ом все, что есть,
откладывать недочитанное и объединять с прочитанным при следующем
чтении:
... # открываем файл, все дела ...
my $broken = '';
while (1) {
if ( (defined ($fh->read ( $buf, 2048 ))) and
( ( (length $broken) + (length $buf) ) > 0 ) ) {
my $chunk = $broken . $buf;
@strings = split /\012/, $chunk;
$broken = (substr($chunk, -1) ne "\012" ? pop @strings : '');
} else {
# $log->print ( "we're in trouble" );
sleep 1;
$fh->sysseek(0, 1) unless $param->{isfifo}; # seek фифе не нужен
next;
}
# обрабатываем строки в @strings...
...
}
Работает, но после чтения первой порции данных постоянно пропадает в else блоке.
(?!стало быть read возвращает undef?!)
Решил проблему альтернативным вариантом:
...
while (1) {
while ( $_ = $fh->getline ) { # тоже самое что и 'while ( <$fh> ) {'
push @strings, $_;
}
sleep 1;
$fh->sysseek(0, 1) unless $param->{isfifo};
# обрабатываем ...
...
}
Этот вариант работает правильно как с простым файлом так и с fifo.
Hо меня интересует - почему не работает первый?! В чем проблема
собственно?
Спасибо.
--
Eugen J. Sobchenko, ejs@bsnis.com.ua
3974 4469 2D4F 8A02 6AF4 FB0D 3568 3AE9 DB94 6BB3
--- ifmail v.2.15dev5
* Origin: PACOnet ISP (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/11042e660e966.html, оценка из 5, голосов 10
|