Автор Тема: PERL запись в файл  (Прочитано 5584 раз)

0 Пользователей и 1 Гость просматривают эту тему.

  • Гость
PERL запись в файл
« : 05 Февраля 2002, 15:49:58 »
Ребят, помогите, плиз. Как в перле добавить запись в файл, но в определенное место, т.е. как позиционировать запись? Напишите строчку. Спасибо всем :)

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
PERL запись в файл
« Ответ #1 : 05 Февраля 2002, 16:25:13 »
Ну попробуй вот так тупо конечно зато надежно:
open(DATA,">$file");
@data=;
foreach(@DATA)
{
  if($_!="что-то нужное"){print DATA "$_"; }
 if($_=="что-то нужное"){print DATA "то что надо записать";}
}

Вроде так код не проверял но вроде должён работать :)
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
PERL запись в файл
« Ответ #2 : 05 Февраля 2002, 16:31:36 »
Цитировать
Вроде так код не проверял но вроде должён работать

Не должен.:)

perldoc -f seek
2B OR NOT 2B = FF

Оффлайн Ilya

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 108
  • +0/-0
  • 0
    • Просмотр профиля
    • www.svd.ru
PERL запись в файл
« Ответ #3 : 05 Февраля 2002, 18:07:49 »
Цитировать
open(DATA,">$file");
@data=;
foreach(@DATA)
{
if($_!="что-то нужное"){print DATA "$_"; }
if($_=="что-то нужное"){print DATA "то что надо записать";}
}


Я примерно так делал и все работало. Только если в файле не только цифры но и текст, то  вместо == и != лучше использовать eq и ne.
« Последнее редактирование: 05 Февраля 2002, 18:24:41 от Ilya »

Оффлайн Ilya

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 108
  • +0/-0
  • 0
    • Просмотр профиля
    • www.svd.ru
PERL запись в файл
« Ответ #4 : 05 Февраля 2002, 18:14:07 »
Вот кусок из скрипта, который я год назад писал. 100% должно работать:

open(FILE, "$prise");
@file=;
close(FILE);
$t=@file;

for($i=0;$i<=$t;$i++)
{
if ($file[$i] eq $strtodel){$file[$i] = $newstr;}
}

open(FILE, ">$prise");
print FILE @file;
close(FILE);

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
нет
« Ответ #5 : 05 Февраля 2002, 19:14:24 »
2Ilya  не.
Цитировать
но в определенное место,

не обязательно в определенную строку. т.е. Chs направил туда куда надо.
 в исканиях.

  • Гость
PERL запись в файл
« Ответ #6 : 05 Февраля 2002, 19:41:09 »
>т.е. Chs направил туда куда надо

Только он забыл сказать, что при этом старая информация потеряется. Как показывает практика, те, кто задает подобные вопросы, не знают о том, что _добавить_ запись в файл невозможно. Можно _заменить_ старую запись на новую.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
хы
« Ответ #7 : 05 Февраля 2002, 19:49:14 »
Цитировать
Только он забыл сказать, что при этом старая информация потеряется.

он не забыл, он направил ;)
кстати, те примеры с циклом тоже перезаписывают:

Цитировать
if ($file[$i] eq $strtodel){$file[$i] = $newstr;}

если нужно вставить (но при это оставить предыдущую), то:
if ($file[$i] eq $strtodel){$file[$i] .= "\\n$newstr\\n";}
 в исканиях.

Оффлайн Боря Елкин

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://webmetr.pips.ru
PERL запись в файл
« Ответ #8 : 06 Февраля 2002, 09:46:02 »
Сам не пробовал так делать (не требовалось), но читал умную книжку (Perl Cookbook) :). Там есть один пример:

Example 8.4: weekearly
#!/usr/bin/perl
# weekearly -- set someone\'s login date back a week
use User::pwent;
use IO::Seekable;

$typedef = \'L A12 A16\';         # linux fmt; sunos is "L A8 A16"
$sizeof  = length(pack($typedef, ()));
$user    = shift(@ARGV) || $ENV{USER} || $ENV{LOGNAME};

$address = getpwnam($user)->uid * $sizeof;

open (LASTLOG, "+    or die "can\'t update /usr/adm/lastlog: $!";
seek(LASTLOG, $address, SEEK_SET)
    or die "seek failed: $!";
read(LASTLOG, $buffer, $sizeof) == $sizeof
    or die "read failed: $!";

($time, $line, $host) = unpack($typedef, $buffer);
$time  -= 24 * 7 * 60 * 60;         # back-date a week
$buffer = pack($typedef, $time, $line, $time);

seek(LASTLOG, -$sizeof, SEEK_CUR)   # backup one record
    or die "seek failed: $!";
print LASTLOG $record;
   
close(LASTLOG)
    or die "close failed: $!";

Я думаю, что некторые сведения можно почерпнуть из этого примера.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
PERL запись в файл
« Ответ #9 : 06 Февраля 2002, 10:04:34 »
Комментарий к технике программирования:
Почти во всех приведенных примерах подразумевалось открытие файлов два раза (один раз на чтение, другой раз на перезапись).
Открытие файла одна из самых "тяжелых" операций с точки зрения ОС и использования ее ресурсов.
2B OR NOT 2B = FF

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
вопрос по теме
« Ответ #10 : 06 Февраля 2002, 13:11:39 »
Цитировать
Открытие файла одна из самых "тяжелых" операций с точки зрения ОС и использования ее ресурсов.

т.е. ты намекаешь что лучше бы так:
open(FILE,"+<$file");
....
truncate(FILE,0);
print FILE @file;
close(FILE);

 а если операции разбора содержимого довольно длительные, то наверное лучше все таки открыть-считать-закрыть, потом открыть-записать или я не прав?
 в исканиях.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
PERL запись в файл
« Ответ #11 : 06 Февраля 2002, 13:56:49 »
Цитировать

а если операции разбора содержимого довольно длительные, то наверное лучше все таки открыть-считать-закрыть, потом открыть-записать или я не прав?

Даже если она длительная, то она ничему не помешает, локировать файл можно непосредственно перед записью нового содержимого.
2B OR NOT 2B = FF

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28