информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[Perl] запись текста в указанную строку текстового файла 24.10.04 12:54  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
Отредактировано 24.10.04 12:55  Количество правок: 1
<"чистая" ссылка>
как сделать такую вещь: сначала стереть указанную строчку файла, а потом записать туда другой текст?
или надо считывать файл в массив, стирать все в файле, изменять массив и писать в чистый уже файл?
Re 24.10.04 13:42  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> как сделать такую вещь: сначала стереть указанную строчку
> файла, а потом записать туда другой текст?
> или надо считывать файл в массив, стирать все в файле,
> изменять массив и писать в чистый уже файл?
Первый вариант - делать как массив. В случае, если файл небольшой - это достаточно эффективно. Однако в большинстве случаев такое не пройдёт.

Другой вариант - использовать конструкцию:
open (FH, "+<filename");
При этом файл откроется и на чтение и на запись. Можно будет писать данные в конкретную позицию файла, затирая то что там было. Но есть одно НО: данные именно затираются, а не вставляются - то есть как будто бы Ты пишешь в текстовом редакторе, отключив режим INS. И тогда могут возникнуть проблемы - если строка, которую надо заменить окажется меньшей по длинне чем то, на что нужно заменить, файл придётся переписывать заново, начиная с той позиции где кончается строка.
Если ты знаешь какfя строка примерно, просто сделай: 24.10.04 13:32  
Автор: choor Статус: Elderman
<"чистая" ссылка>
Если ты знаешь какfя строка примерно, просто сделай:
open(FILE,"test.txt");
@rf=<FILE>;
close(FILE);
@rf[$nomer_stroki]=$kakoeto_znachenie;
потом запиши это в тот же файл...
Но это вариант если файл не очень большой, в другом случае используй while, добавив какойнить икс для счётчика
так я именно это и пытаюсь у вас узнать, как записать это в... 24.10.04 13:55  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
<"чистая" ссылка>
> Если ты знаешь какfя строка примерно, просто сделай:
> open(FILE,"test.txt");
> @rf=<FILE>;
> close(FILE);
> @rf[$nomer_stroki]=$kakoeto_znachenie;
> потом запиши это в тот же файл...

так я именно это и пытаюсь у вас узнать, как записать это в тот же файл, если указана строка...
open (FILE,"filename"); 24.10.04 15:02  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
> > Если ты знаешь какfя строка примерно, просто сделай:
> > open(FILE,"test.txt");
> > @rf=<FILE>;
> > close(FILE);
> > @rf[$nomer_stroki]=$kakoeto_znachenie;
> > потом запиши это в тот же файл...
>
> так я именно это и пытаюсь у вас узнать, как записать это в
> тот же файл, если указана строка...

open (FILE,"filename");
@FILE=<FILE>;
close FILE;
$FILE[$num]=$str;
open (FILE,">filename");
print FILE join "", @FILE;
close FILE;

Здесь $num - номер строки, которую нужно заменить, $str - строка, на которую нужно заменить.
Странно... А почему у меня вот такая вещь тогда не получается: 25.10.04 09:57  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
<"чистая" ссылка>
Хм.. странно... а почему у меня такая вещь неполучается:
вот форма редактирования сообщения в гесте:

   open GB, "$file";
   @am = <GB>;
   chomp(@am);
   close GB;

   $lm = @am;
   $Mted = $lm - $adm_msg-1; #переменную $adm_msg я принимаю через CGI
   $emsg = $am[$Mted];
   print qq~
   <table align=center width=70%>
   <tr><th>Редактирование сообщения</th></tr>
   <tr><td><center>
   Внимание! Удаление конструкций ";;;;;" может привести к ошибке!<br>
   <form action=gb.pl method=post>
   <textarea name=Emsg rows=10 cols=50>$emsg</textarea><br>
   <input name=action value=edit type=hidden>
   <input name=Mted value=$Mted type=hidden>
   <input type=submit value=Изменить>
   </form></td></tr></table>
   ~;
   if ($action eq "edit")
   {
    &edit_msg;
   }

---

А вот код подрограммы, производящей непосредственно замену исправленной строки файла:
sub edit_msg {
 $Emsg=$q->param("Emsg");
 $Mted=$q->param("Mted");
 if ($Emsg ne "")
 {
  open GB, "$file";
  @af = <GB>;
  close GB;
  $af[$Mted] = $Emsg;
  open GB, ">$file";
  print GB "@af";
  close GB;
 }
}

---
Поясню на всякий случай. В форму редактирования сообщения берется строка из файла на редактирование и в поле textarea у меня она появляется. То есть ошибка где-то в подпрограмме или "по пути" к ней. Подскажите, пожалуйста, в чем проблема.
Возмоные ошибки 25.10.04 22:38  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Глубоко не вникал, но вот что бросилось в глаза:

1. Не советовал бы использовать в таком контексте псевдокавычки qq. Хотя про их пользу говорят на каждом углу, я не раз сталкивался с совершенно неожиданными фокусами этих кавычек. А когда строка рвётся на несколько строк - вообще жуть. Лучше используй конструкцию <<МЕТКА:

print <<МЕТКА;
встроенный
документ
(интерполяция включена)

МЕТКА

2. Как я понял, $lm должна содержать количнство строк. Но, вообще-то присвоение $lm=@am заносит в переменную последнее значение массива, а не количетво его элементов. Размер массива лежит в переменной (вернее, в специальной синтаксической конструкцией, которая работает как переменная) $#am - попробуй, возможно, поможет.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach