LINUX.ORG.RU

удалить строки (перл)


0

0

Добрый день! Скажите мне пожалуйста, как с помошью перла, можно удалить строку в файле. К примеру есть файл типа такого
Вася|10|654|no|12.04.2004|
Петя|15|64|yes|12.04.2004|
Коля|14|4|no|12.04.2004|
Женя|11|1005|no|12.04.2004|

И мне надо удалить строку Коля|14|4|no|12.04.2004|
причем без создания нового файла. Как это сотворить? Скажите пожалуйста!

anonymous

Если совсем коротко, то perldoc Tie::File
(входит в стандартный комплект начиная с 5.8.0)


Если подробнее, то:

Ты бы, мил человек, какую книжку по программировани прочитал,
по алгоритмам там всяким. А потом уже Perl и то-се.

Файл (в Unix) - это просто последовательность байтов.
Из него нельзя "удалить строку".
Если есть требование ни в коем случае не создавать нового файла
то можно сделать так:

1. Найти эту строку Коля|14|4|no|12.04.2004|
2. Определить ее длину N (в байтах).
3. Переписать все содержимое файла после искомой строки на N
байтов ближе к началу файла, затирая таким образом ту самую строку.
(эта процедура сама по себе может потребовать многих
операций чтения,записи и позиционирования).
4. Уменьшить длину файла (ftruncate).

А уж на чем это - C, C++ или там Perl - дело десятое.

P.S. Конечно, через memory mapped file тоже можно, но смысл один и тот же.

P.P.S. Так что давай-ка ты парнишка подучись, не в обиду ;-)

anonymous
()

open(FH,"my_file");

@my_hash = grep( ! /Коля/} <FH>;

close FH;

open FH, ">my_file";

foreach (@my_hash) {
   print FH;
}

close FH;

Типа того?...

Виталий.

anonymous
()
Ответ на: комментарий от anonymous

> open(FH,"my_file");
...
> Виталий.

Это работает пока файл настолько мал,
что его можно прочитать в память целиком.

anonymous
()
Ответ на: комментарий от anonymous

Виталий - ВЫ ГУРУ!!!! Уж не знаю как на счет первого ответа, но ВАШ ответ - это то, что надо! ОГРОМНОЕ ВАМ СПАСИБО! Без всяких там изысков и самоутвержддений, и пусканий пыли в глаза, а четко и точно как профессионал! Благодарен! еще раз Спасибо!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.