URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4692
[ Назад ]

Исходное сообщение
"Модификация файла"

Отправлено ajvon , 27-Сен-05 17:27 
Хочу perl"ом изменять файл. Некоторые строчки удалять, некоторые изменять. Как это сделать? Получилось только записать в конец файла. Вижу решение только в создании временного файла, а потом сделать cp tempfile origfile.

Содержание

Сообщения в этом обсуждении
"Модификация файла"
Отправлено ajvon , 30-Сен-05 12:36 
Я делал так
open f, "+< modifyfile_res"
while (!eof (f))
{
  $var=<f>;
  if ($var=~m/druga/)
  {
    $var=~s/druga//;
    print f $var;
  }
}
close (f);
И в результате все добавляэться в конец файла. А мне надо заменить строчку в которой есть слово druga
Посоветуйте, пожалуйста, как это правильно сделать.

"Модификация файла"
Отправлено chip , 30-Сен-05 14:59 
>Я делал так
>open f, "+< modifyfile_res"
>while (!eof (f))
>{
>  $var=<f>;
>  if ($var=~m/druga/)
>  {
>    $var=~s/druga//;
>    print f $var;
>  }
>}
>close (f);
>И в результате все добавляэться в конец файла. А мне надо заменить
>строчку в которой есть слово druga
>Посоветуйте, пожалуйста, как это правильно сделать.

Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать sed .

В качестве идеи для perl'a:
echo 'u!r.l9i!%!a!m%zt4e23s%-p5i62h11c' | perl -e '$_ = do { local $/; <STDIN> }; s/(%|!|\d*)//g; s/z/\@/g; print reverse(split(//));'

Т.е. конструкцией: do { local $/; <FILEHANDLE> } читаем в переменную весь файл, а потом можем изгаляться над ним сколько вздумается. Нужно помнить, что на больших файлах могут выйти накладки с распределением памяти.


"Модификация файла"
Отправлено ajvon , 30-Сен-05 15:34 
>Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать
>sed .
Тоесть делать вставки system (sed 's/....//');?
>
>В качестве идеи для perl'a:
>echo 'u!r.l9i!%!a!m%zt4e23s%-p5i62h11c' | perl -e '$_ = do { local $/; <STDIN> }; s/(%|!|\d*)//g; s/z/\@/g; print reverse(split(//));'
>
>Т.е. конструкцией: do { local $/; <FILEHANDLE> } читаем в переменную весь файл, а потом можем изгаляться над ним сколько вздумается. Нужно помнить, что на больших файлах могут выйти накладки с распределением памяти.

Это фактически вывод в другой файл(здесь STDOUT), и все сводиться до
>cp tempfile origfile
Разве не так?


"Модификация файла"
Отправлено chip , 30-Сен-05 19:01 
>>Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать
>>sed .
>Тоесть делать вставки system (sed 's/....//');?

Нет. Использовать командный интерпретатор и sed. А о perl'e забыть.

>>
>>В качестве идеи для perl'a:
>>echo 'u!r.l9i!%!a!m%zt4e23s%-p5i62h11c' | perl -e '$_ = do { local $/; <STDIN> }; s/(%|!|\d*)//g; s/z/\@/g; print reverse(split(//));'
>>
>>Т.е. конструкцией: do { local $/; <FILEHANDLE> } читаем в переменную весь файл, а потом можем изгаляться над ним сколько вздумается. Нужно помнить, что на больших файлах могут выйти накладки с распределением памяти.
>
>Это фактически вывод в другой файл(здесь STDOUT), и все сводиться до
>>cp tempfile origfile
>Разве не так?

Что мешает записать $_ в тот же файл?! Предварительно сместив указатель на начало файла.

>Это фактически вывод в другой файл(здесь STDOUT), и все сводиться до

Разница имеется. Нет временного файла, все манипуляции осуществляются в памяти.

Если хотите непосредственно манипулировать файлом на диске, а не во временном хранилище используйте seek.

Пример,

#!/usr/bin/env perl -w

my $POSITION = 2;
open(FH, "+< filename") || die "can't update somewhere: $!";
seek(FH, $POSITION, 0);
# munge the record
print FH \000;
close FH;

perldoc -f seek

ps: и, наконец, perldoc -q file


"Модификация файла"
Отправлено MaximKuznetsov , 30-Сен-05 22:40 
формулируйте задачу правильно..
Формулировка не должна зависить от средств реализации -
Насколько можно представить, Вы хотите некоторые строки соотвествующие одному шаблону удалить, а некоторые, соответствующие другому шаблону изменить

последовательно читать - и сравнивать с двумя шаблонами..awk, sed..

правильно заданный вопрос - половина ответа, а то и больше; если правильно задать вопрос, то и ответ как-то сам находится...