Forum Webscript.Ru
Программирование => Perl => Тема начата: от 05 Февраля 2002, 15:49:58
-
Ребят, помогите, плиз. Как в перле добавить запись в файл, но в определенное место, т.е. как позиционировать запись? Напишите строчку. Спасибо всем :)
-
Ну попробуй вот так тупо конечно зато надежно:
open(DATA,">$file");
@data=;
foreach(@DATA)
{
if($_!="что-то нужное"){print DATA "$_"; }
if($_=="что-то нужное"){print DATA "то что надо записать";}
}
Вроде так код не проверял но вроде должён работать :)
-
Вроде так код не проверял но вроде должён работать
Не должен.:)
perldoc -f seek
-
open(DATA,">$file");
@data=;
foreach(@DATA)
{
if($_!="что-то нужное"){print DATA "$_"; }
if($_=="что-то нужное"){print DATA "то что надо записать";}
}
Я примерно так делал и все работало. Только если в файле не только цифры но и текст, то вместо == и != лучше использовать eq и ne.
-
Вот кусок из скрипта, который я год назад писал. 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);
-
2Ilya не.
но в определенное место,
не обязательно в определенную строку. т.е. Chs направил туда куда надо.
-
>т.е. Chs направил туда куда надо
Только он забыл сказать, что при этом старая информация потеряется. Как показывает практика, те, кто задает подобные вопросы, не знают о том, что _добавить_ запись в файл невозможно. Можно _заменить_ старую запись на новую.
-
Только он забыл сказать, что при этом старая информация потеряется.
он не забыл, он направил ;)
кстати, те примеры с циклом тоже перезаписывают:
if ($file[$i] eq $strtodel){$file[$i] = $newstr;}
если нужно вставить (но при это оставить предыдущую), то:
if ($file[$i] eq $strtodel){$file[$i] .= "\\n$newstr\\n";}
-
Сам не пробовал так делать (не требовалось), но читал умную книжку (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: $!";
Я думаю, что некторые сведения можно почерпнуть из этого примера.
-
Комментарий к технике программирования:
Почти во всех приведенных примерах подразумевалось открытие файлов два раза (один раз на чтение, другой раз на перезапись).
Открытие файла одна из самых "тяжелых" операций с точки зрения ОС и использования ее ресурсов.
-
Открытие файла одна из самых "тяжелых" операций с точки зрения ОС и использования ее ресурсов.
т.е. ты намекаешь что лучше бы так:
open(FILE,"+<$file");
....
truncate(FILE,0);
print FILE @file;
close(FILE);
а если операции разбора содержимого довольно длительные, то наверное лучше все таки открыть-считать-закрыть, потом открыть-записать или я не прав?
-
а если операции разбора содержимого довольно длительные, то наверное лучше все таки открыть-считать-закрыть, потом открыть-записать или я не прав?
Даже если она длительная, то она ничему не помешает, локировать файл можно непосредственно перед записью нового содержимого.