PDA

Показать полную графическую версию : Как оставить в файле Х первых строк?


Dan
12-10-2002, 19:24
Есть файлик с таким содержанием:
"
1
2
3
4
5
6
"
Надо, удалить все, кроме первых пяти строк. Как это сделать на perl?

Guest
14-10-2002, 07:37
Создать временный файл, скопировать туда первые пять строк, удалить старый файл и переименовать временный фал под именем старого.:)

Dan
14-10-2002, 16:14
Я пошел на irc и мне там посовевали способ получше

open(RE, "$counter_file");
@indata = <RE>;
close(RE);
open(SAV, ">$counter_file");
foreach $temp (@indata)
{
       $counterzapis++;
       if ($counterzapis<=5)
       {
               print SAV $temp;
       }
}

vasketsov
14-10-2002, 16:34
Dan
Совет Guest-а более надежен, к тому же мне приходилось сталкиваться с разным пониманием префикса > (и не только его, кстати) в имени открываемого файла на разных версиях разных перлов для Windows, так что тестируй чтоб хвост не остался.

Dan
14-10-2002, 18:02
vasketsov
Это будет внутри скрипта, т.е туда никаких параметров внешних не проходит...
А что ненадежного, я не пойму? Вроде как раз все будет нормально. Объясните?

vasketsov
17-10-2002, 13:06
Dan
У тебя файл читается, потом открывается для записи и полностью очищается, и потом ты туда пишешь. А если дописать не успел?

Самый же безопасный и правильный вариант, да и самый простой, почему он сразу в голову не пришел только, это
1) открыть файл с префиксом +< (это открытие для чтения и записи, если файл есть, его содержимое сохраняется, если нет - он создается)
2) искать конец нужной строки.
3) установить конец файла в этом месте (возможно, придется обратить внимание на POSIX).
4) закрыть файл

Добавлено:

А про хвост - это я имел в виду, что в некоторых реализациях файл не очищается.

Dan
17-10-2002, 15:05
У тебя файл читается, потом открывается для записи и полностью очищается, и потом ты туда пишешь. А если дописать не успел?
Т.е. если сервак зависнет в этот момент?

vasketsov
17-10-2002, 16:45
Dan
или банальное веерное отключение электроэнергии BY CHUBAIS.

Dan
18-10-2002, 14:01
Но ведь вся IB написана так и ничего...

Вообще-то я сделал не так... У меня сначала (в foreach) все пишется в массив, а потом массив пишется в файл

ivank
18-10-2002, 22:07
Dan
Но ведь вся IB написана так и ничего... Очень даже чего [я этого не говорил (а то самому же править придётся :)), но при сеголняшней нагрузке случаются регулярные поглюкивания, ибо Мэтт даже флоком по человечески пользоваться не умеет.]

Dan
19-10-2002, 00:41
Я пока еще flock не трогал... т.е. в нем не разбирался :)
А что там такого, что Мэтт коряво сделал?




© OSzone.net 2001-2012