PDA

Показать полную графическую версию : Perl File::tail


Jonik-Mnimonik
30-03-2011, 09:24
Здравствуйте! У меня возникла следующая ситуация!
У меня есть пустой файл "file.txt", время от времени туда приходит некая информация. Мой скрипт "print.pl" подключается к этому файлу, читает его построчно, и выводит на экран содержимое. И вот тут возникает проблема, когда в файл "file.txt" приходит строка в которой не символа конца строки, то скрипт держит эту строку и не выплёвывает её.

Опишу некоторый тест который я проводил.
1. Создаю пустой файл file.txt и создаю файл 1.txt (я их прикрепил к сообщению).
2. Запускаю скрипт print.pl
3. В другой консоле делаю "cat 1.txt >> file.txt"
4. В результате на экране у меня высвечивается строки 1 и 2 (без строки 3), а в файле file.txt все 3 строки.
5. Далее опять делаю "cat 1.txt >> file.txt" и врезультате у меня третья строка от первого раза вылетает и показывается на экране.

Помогите плиз, может есть в функции fail::tail какие нибуть настройки.

mar
30-03-2011, 10:36
а нельзя ли тоже самое, но гораздо проще?

#!/usr/bin/perl

open(testFile, "file.txt") || die;

while ($line = <testFile>)
{
print $line ;
}

close ( testFile );

При этом все три строки выводятся (хотя последняя, естественно, без признака конца строки

Jonik-Mnimonik
30-03-2011, 11:40
Мне необходимо сделать в той структуре которую я указал.

mar
30-03-2011, 13:11
да, я не подумала про tail. Но там как раз ожидается строка, т.е. полностью, с символом завершения (да и в логах, для которого это используется, признак конца строки всегда есть). так что не уверена, что в таком виде это решаемо

dmitryst
30-03-2011, 13:54
а просто "tail -f имя_файла" не подходит?

mar
30-03-2011, 15:07
кстати, да - обычный tail берет и последнюю строку из этого примера

Jonik-Mnimonik
30-03-2011, 15:22
Я описал только небольшой пример, отображающий суть проблемы. на самом деле мне необходимо чтобы этот скрипт работал постоянно и делал действия если пришла строка, а если строки нет необходимо делать другие действия.
Я рассматривал различные варианты решения своей задачи, и этот способ оказался для меня наиболее приемлимый.
Может можно изменить сму функцию fail::tail? Там где держиться строка более 1 секунды принудительно вставлять \n и выталкивать строку. Только вот я никак не могу найти где это можно исправить.
Почему-то не могу загрузить сам файл вот ссылка:

http://cpansearch.perl.org/src/MGRABNAR/File-Tail-0.99.3/Tail.pm

mar
31-03-2011, 15:07
Jonik-Mnimonik,
кстати, у Вас там третья строка появляется, когда приходит очередная партия. Можно раз в 1 с по крону добавлять в файл служебную строку (полноценную). Она будет "выталкивать" задержавшиеся строки, а саму ее легко будет игнорировать

z01
16-07-2011, 00:18
кстати, у Вас там третья строка появляется, когда приходит очередная партия. Можно раз в 1 с по крону добавлять в файл служебную строку (полноценную). Она будет "выталкивать" задержавшиеся строки, а саму ее легко будет игнорировать »

Костыль, а если строка будет дольше чем 1 секунда?

Проще задать максимальную строку, и если конец строки не встретился через N символов добавлять символ конца строки.




© OSzone.net 2001-2012