Хочу perl"ом изменять файл. Некоторые строчки удалять, некоторые изменять. Как это сделать? Получилось только записать в конец файла. Вижу решение только в создании временного файла, а потом сделать cp tempfile origfile.
Я делал так
open f, "+< modifyfile_res"
while (!eof (f))
{
$var=<f>;
if ($var=~m/druga/)
{
$var=~s/druga//;
print f $var;
}
}
close (f);
И в результате все добавляэться в конец файла. А мне надо заменить строчку в которой есть слово druga
Посоветуйте, пожалуйста, как это правильно сделать.
>Я делал так
>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> } читаем в переменную весь файл, а потом можем изгаляться над ним сколько вздумается. Нужно помнить, что на больших файлах могут выйти накладки с распределением памяти.
>Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать
>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
Разве не так?
>>Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать
>>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
формулируйте задачу правильно..
Формулировка не должна зависить от средств реализации -
Насколько можно представить, Вы хотите некоторые строки соотвествующие одному шаблону удалить, а некоторые, соответствующие другому шаблону изменитьпоследовательно читать - и сравнивать с двумя шаблонами..awk, sed..
правильно заданный вопрос - половина ответа, а то и больше; если правильно задать вопрос, то и ответ как-то сам находится...