Forum Webscript.Ru

Программирование => Perl => Тема начата: softsafer от 07 Мая 2004, 03:54:10

Название: Как сохранить хэш в файл?
Отправлено: softsafer от 07 Мая 2004, 03:54:10
Господа, как сохранить хэш, или другую структуру в файл, и как прочитать? Желательно без лишних телодвижений.
Название: Как сохранить хэш в файл?
Отправлено: alm от 07 Мая 2004, 07:44:09
Есть какой-то модуль на эту тему. Что-то типа DataDumper.

За название не ручаюсь, поищи на search.cpan.org
Название: Как сохранить хэш в файл?
Отправлено: alm от 07 Мая 2004, 07:45:24
Вот как он называется

Data::Dumper;
Название: Как сохранить хэш в файл?
Отправлено: alm от 07 Мая 2004, 07:46:42
Вот блин форум заменил :)

Попробуем повторить
Data :: Dumper
Название: Как сохранить хэш в файл?
Отправлено: Phoinix от 07 Мая 2004, 10:05:53
alm
Да, вот только, что-то про сохранение в файл в мануале ничего не сказано...

softsafer

Простой пример:

my @keys = keys %hash1;
open (FILE, ">./data.txt");
flock (FILE, 2);
foreach (@keys) {
print FILE $_,\'=\',$hash1{$_},"\\n"; # Исправлено:  print FILE, "$_=$hash1{$_}\\n";
}
close FILE;

open (FILE, "./data.txt");
my @data = ;
close FILE;
chomp @data;
my %hash2;
foreach (@data) {
  (my $key, my $value) = split(/=/,$_);
  $hash2{$key} = $value;
}
Название: Как сохранить хэш в файл?
Отправлено: Wyclef от 07 Мая 2004, 11:05:38
perldoc Storable
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 07 Мая 2004, 11:25:14
Phoinix а зачем ты порождаеш @keys?
print FILE, "$_=$hash1{$_}\\n"; Здесь синтаксический анализатор тебя пошлет читать perldoc
 
А насчет сохранения - не более сложно чем у тебя:
open DB, ">file" or die "Can\'t do that: $!";
print DB Data::Dumper-> Dump([$data], [qw($data)]);
close DB;
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 07 Мая 2004, 11:31:57
Wyclef можно тогда и DBM файл для этого использовать.
perldoc -f tie
Название: Как сохранить хэш в файл?
Отправлено: Phoinix от 07 Мая 2004, 11:57:31
NeoNox
Цитировать
а зачем ты порождаеш @keys?


Никогда не лишне знать функции keys и values для разбора хеш массива... :)

Цитировать
print FILE, "$_=$hash1{$_}\\n"; Здесь синтаксический анализатор тебя пошлет читать perldoc


Да послал... поспешил... :(

   print FILE $_,\'=\',$hash1{$_},"\\n";
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 07 Мая 2004, 12:29:20
Phoinix никогда не стоит нагружать память сервера бесполезной информацией. Эти значения ты запросто сможеш взять напрямую из хеша.
Кстати твой способ нагнется при использованиии сложной структуры (типа хеша хешей масивов :) )
Название: Как сохранить хэш в файл?
Отправлено: Wyclef от 07 Мая 2004, 12:36:45
NeoNox предпочитаю MLDBM - у него нет ограничения на объем данных.
В курсе ;)
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 07 Мая 2004, 12:45:43
Wyclef сходу вопрос: а в MLDBM я могу поместь что-то типа

my $data = {
        \'dynamo\'=>{
                \'color\'=>\'blue\',
                \'name\'=>\'dynamo\',
                \'stadium\'=>\'Dynamo\'
                },
        \'spartak\'=>{
                \'color\'=>\'red\',
                \'name\'=>\'spartak\',
                \'stadium\'=>\'Luzhniki\'
                }
        };
 ?
Это чисто для спортивного интереса.
Название: Как сохранить хэш в файл?
Отправлено: Wyclef от 07 Мая 2004, 12:50:53
NeoNox
Легко
Название: Как сохранить хэш в файл?
Отправлено: Phoinix от 07 Мая 2004, 14:39:01
NeoNox
Цитировать
Кстати твой способ нагнется при использованиии сложной структуры


Не спорю, а я и не претендую, на то, что мой способ униварсальный и самый оптимальный, это просто вариант

Цитировать
никогда не стоит нагружать память сервера бесполезной информацией. Эти значения ты запросто сможеш взять напрямую из хеша.


Опять же не спорю, можно и так:

foreach (keys %hash) {...

Но так не столь наглядно IMHO... важен наслолько я понимаю принцип, а не готовый код... ;)
Название: Как сохранить хэш в файл?
Отправлено: Wyclef от 07 Мая 2004, 15:10:36
Phoinix
Цитировать
use Storable;
store \\%table, \'file\';
$hashref = retrieve(\'file\');

Наглядно? ;)
Название: Как сохранить хэш в файл?
Отправлено: glebushka от 07 Мая 2004, 15:21:47
гм, а почему бы не использовать XML? А конкретнее модуль XML::Simple?
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 07 Мая 2004, 15:35:03
понеслось :)
а почему бы не использовать Oracle для гостевой книги?
Название: Как сохранить хэш в файл?
Отправлено: glebushka от 07 Мая 2004, 16:09:20
NeoNox, я например храню все данные юзверей, все их настройки, права и т.п. в хмл-файлах. По файлу на каждого юзверя.
Структура данных получается именно хеш, ну или реже хеш хешей.
Я что-то неправильно делаю? Это можно проще реализовать?
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 07 Мая 2004, 16:23:07
glebushka да без вопросов, это только вопрос скорости и предпочтений. Я лиш могу порекомендовать в твоем случае взглянуть на http://search.cpan.org/~wadg/Config-IniFiles-2.38/IniFiles.pm
Название: Как сохранить хэш в файл?
Отправлено: glebushka от 07 Мая 2004, 16:50:28
NeoNox, круто, спасибо, не  видел его. Есть смысл переписывать код под него? Нагрузка на сервер будет существенно меньше, чем при использовании XML::Simple?
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 07 Мая 2004, 17:18:29
Нужно проводить тесты, но я практически уверен что будет ниже. Распарсивание XML структуры это серьезная нагрузка на сервер. Хотя, все зависит от обьемов.
Название: Как сохранить хэш в файл?
Отправлено: glebushka от 07 Мая 2004, 18:10:34
NeoNox, объём небольшой. Вот пример:




ok
ok


ok
15



login
glebushka


tinytext
......
......
......



Всего записей будет, думаю не более 50 (включая настройки (preferences), привилегии (rights) и информацию о пользователе (records)).
Сейчас у меня вся информация хранится в файлах, вида 1.xml...n.xml
И дублируется в MySQL часть полей:
id bigint(10) unsigned PRI NULL auto_increment
login  tinytext YES  MUL NULL    
mail  tinytext YES NULL
date tinytext YES  NULL
pass tinytext YES  NULL
MySQL использую при авторизации пользователя (авторизация по полю mail+pass). А также для вывода списка пользователей, и навигации по нему.
Естественно, при загрузке страницы авторизированным пользователем приходится каждый раз парсить его файл, определяя его настройки и права. Ну и ещё приходится парсить когда запрашивают данные о конкретном пользователе.
Название: Как сохранить хэш в файл?
Отправлено: commander от 11 Мая 2004, 13:31:01
glebushka
Зачем ты используешь XML если у тебя есть MySQL?
Название: Как сохранить хэш в файл?
Отправлено: commander от 11 Мая 2004, 13:32:59
NeoNox
Как на счет безопасности при использования этого модуля (Config::IniFiles) для веб?
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 11 Мая 2004, 13:41:59
commander не совать грязные пальцы в рот, и заболевание кишечника тебе не грозит. Я не думаю, что ты /etc/passwd файл ложиш в место видное из веба, правильно?
Название: Как сохранить хэш в файл?
Отправлено: glebushka от 11 Мая 2004, 21:20:31
commander, ИМХО, хранить подобные данные в MySQL не самая позитивная идея.
1. Кроме вышеперечисленных данных, хранящихся в MySQL все остальные данные используются относительно редко:
а) при авторизации зарегенного пользователя.
б) при посмотре кем-нибудь его данных.
2. Особенности данных. Существуют несколько групп пользователей. У каждой группы пользователей, есть свои специфические поля. Т.е. если переносить в MySQL то получится очень большая таблица, в которой большинство полей будут NULL. Даже с чисто эстетической точки зрения это не очень здорово:)
3. Набор полей, предполагается, будет меняться. А постоянно удалять и добавлять поля в MySQL не слишком удачная идея. ИМХО.
Название: Как сохранить хэш в файл?
Отправлено: softsafer от 12 Мая 2004, 04:58:28
Спасибо, сделал с помощью use Storable; В Хэшэ кстати дерево хранится.
Название: Как сохранить хэш в файл?
Отправлено: softsafer от 12 Мая 2004, 05:11:32
Цитировать
glebushka:
гм, а почему бы не использовать XML? А конкретнее модуль XML::Simple?


У хостера неделю не работали некоторые модули. А данные хранились в XML. В срочно порядке пришлось переделывать код на другое хранилище :).
Название: Как сохранить хэш в файл?
Отправлено: commander от 12 Мая 2004, 11:42:27
glebushka
Цитировать
то получится очень большая таблица, в которой большинство полей будут NULL.


Цитировать
Набор полей, предполагается, будет меняться. А постоянно удалять и добавлять поля в MySQL не слишком удачная идея.

При грамотном формировании БД вышеперечисленные доводы не имеют под собой основания... :) Но это моё личное мнение...
Название: Как сохранить хэш в файл?
Отправлено: commander от 12 Мая 2004, 11:46:30
NeoNox
Цитировать
не совать грязные пальцы в рот, и заболевание кишечника тебе не грозит. Я не думаю, что ты /etc/passwd файл ложиш в место видное из веба, правильно?

правильно... :) Но по поводу хранения данных, я предпочитаю всё хранить в БД, это намного быстрее и удобнее...
Название: Как сохранить хэш в файл?
Отправлено: commander от 12 Мая 2004, 11:50:28
Да и ещё... :
glebushka
Что тебе мешает создать систему из нескольких таблиц, которая будет удовлетворять свем твоим потребностям? При грамотной чятельно продуманной системе, тебе не придеться удалять и добавлять поля...
Но как говориться мы пионеры легких путей не ищем... :)
Название: Как сохранить хэш в файл?
Отправлено: NeoNox от 12 Мая 2004, 12:03:16
Цитировать
commander:
это намного быстрее и удобнее...

намного быстрее чего? тесты проводил или просто так сказал?