Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Запись хэша в файл, после определенных манипуляций


Автор: dya 20.10.2007, 19:26
Есть файл с записями.
Код
test1:09:98:68
test2:97:68:23
После манипуляции с файлом я получаю хеш, вида.
Код

%h = (
    'test1' => [ 09, 98, 68 ],
    'test2' => [ 97, 68, 23 ],
);
Теперь я изменяю значение $h{ 'test2' }[1] на 21.
Мне необходима произвести изменения(запись) в файле.
Код
test1:09:98:68
test2:97:21:23
Как это сделать и возможно ли пример, без использование модулей.

Вариант как переписать полностью строку в файле отпадает.

Переоценил свои возможности. Думаю еще нужна помощь в создание хэша, который приведён сверху.

Автор: KSURi 20.10.2007, 20:27
perldoc SDBM_File

Создание хэша:
Код

open(IN, 't.txt') || die $!;

my %hash;
chomp, $hash{(split':')[0]} = [(split':')[1..3]] while <IN>;

close IN;

Автор: nitr 20.10.2007, 20:49
dya, вы опишите "правильно" свой вопрос! Тогда помогут, тем более что "по-простому" задача проста и "на чтение" и "на запись".

Автор: dya 20.10.2007, 22:03
надо считать фаил в хэш+массив, изменить определенное значения в хэши а потом не переписывая весь фаил, заменить только то значения где была замена в хэши(куда считывали).

ну хз как еще вроде показать, сверху же примером.

Автор: nitr 21.10.2007, 01:39
Имхо любое решение для больших файлов будет "кушать" очень много ресурсов (а конкретнее память), т.к. всё загоняется в хеш.

вот одно из них (воспользуюсь примером KSURi ;) ):

script.pl
Код

#!/usr/bin/perl
use strict;
use warnings;

use Tie::File;

my @data;
tie @data, "Tie::File", '178100.txt' or die "$!\n";

my %h = map {(split /:/,$_)[0] => [(split /:/,$_)[1..3]]} @data;

$h{'test2'}[1] = '21';

@data = map { "$_:".join(':',@{$h{$_}}) } keys %h;


178100.txt
Код

test1:09:98:68
test2:97:68:23


Добавлено через 2 минуты и 4 секунды

а вот с модулями (с установками) *DB*_File вы замучиетесь.

Автор: dya 21.10.2007, 02:33
Спс, есть еще варианты? Буду признателен.

Автор: korob2001 21.10.2007, 12:25
Ну раз уж мы юзаем хеш, то может подумать над тем, что бы использовать DBM файл??? Тогда и память твоя будет свободна, так как при работе с DBM хеш связывается с файлом, а не читает его в память.

Автор: nitr 21.10.2007, 21:22
dya, как сказали "ВСЕ": или "ресурсы" или заюзать модули *DB*_File

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)