Forum Webscript.Ru
Программирование => Perl => Тема начата: softsafer от 07 Мая 2004, 03:54:10
-
Господа, как сохранить хэш, или другую структуру в файл, и как прочитать? Желательно без лишних телодвижений.
-
Есть какой-то модуль на эту тему. Что-то типа DataDumper.
За название не ручаюсь, поищи на search.cpan.org
-
Вот как он называется
Data::Dumper;
-
Вот блин форум заменил :)
Попробуем повторить
Data :: Dumper
-
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;
}
-
perldoc Storable
-
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;
-
Wyclef можно тогда и DBM файл для этого использовать.
perldoc -f tie
-
NeoNox
а зачем ты порождаеш @keys?
Никогда не лишне знать функции keys и values для разбора хеш массива... :)
print FILE, "$_=$hash1{$_}\\n"; Здесь синтаксический анализатор тебя пошлет читать perldoc
Да послал... поспешил... :(
print FILE $_,\'=\',$hash1{$_},"\\n";
-
Phoinix никогда не стоит нагружать память сервера бесполезной информацией. Эти значения ты запросто сможеш взять напрямую из хеша.
Кстати твой способ нагнется при использованиии сложной структуры (типа хеша хешей масивов :) )
-
NeoNox предпочитаю MLDBM - у него нет ограничения на объем данных.
В курсе ;)
-
Wyclef сходу вопрос: а в MLDBM я могу поместь что-то типа
my $data = {
\'dynamo\'=>{
\'color\'=>\'blue\',
\'name\'=>\'dynamo\',
\'stadium\'=>\'Dynamo\'
},
\'spartak\'=>{
\'color\'=>\'red\',
\'name\'=>\'spartak\',
\'stadium\'=>\'Luzhniki\'
}
};
?
Это чисто для спортивного интереса.
-
NeoNox
Легко
-
NeoNox
Кстати твой способ нагнется при использованиии сложной структуры
Не спорю, а я и не претендую, на то, что мой способ униварсальный и самый оптимальный, это просто вариант
никогда не стоит нагружать память сервера бесполезной информацией. Эти значения ты запросто сможеш взять напрямую из хеша.
Опять же не спорю, можно и так:
foreach (keys %hash) {...
Но так не столь наглядно IMHO... важен наслолько я понимаю принцип, а не готовый код... ;)
-
Phoinix
use Storable;
store \\%table, \'file\';
$hashref = retrieve(\'file\');
Наглядно? ;)
-
гм, а почему бы не использовать XML? А конкретнее модуль XML::Simple?
-
понеслось :)
а почему бы не использовать Oracle для гостевой книги?
-
NeoNox, я например храню все данные юзверей, все их настройки, права и т.п. в хмл-файлах. По файлу на каждого юзверя.
Структура данных получается именно хеш, ну или реже хеш хешей.
Я что-то неправильно делаю? Это можно проще реализовать?
-
glebushka да без вопросов, это только вопрос скорости и предпочтений. Я лиш могу порекомендовать в твоем случае взглянуть на http://search.cpan.org/~wadg/Config-IniFiles-2.38/IniFiles.pm
-
NeoNox, круто, спасибо, не видел его. Есть смысл переписывать код под него? Нагрузка на сервер будет существенно меньше, чем при использовании XML::Simple?
-
Нужно проводить тесты, но я практически уверен что будет ниже. Распарсивание XML структуры это серьезная нагрузка на сервер. Хотя, все зависит от обьемов.
-
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). А также для вывода списка пользователей, и навигации по нему.
Естественно, при загрузке страницы авторизированным пользователем приходится каждый раз парсить его файл, определяя его настройки и права. Ну и ещё приходится парсить когда запрашивают данные о конкретном пользователе.
-
glebushka
Зачем ты используешь XML если у тебя есть MySQL?
-
NeoNox
Как на счет безопасности при использования этого модуля (Config::IniFiles) для веб?
-
commander не совать грязные пальцы в рот, и заболевание кишечника тебе не грозит. Я не думаю, что ты /etc/passwd файл ложиш в место видное из веба, правильно?
-
commander, ИМХО, хранить подобные данные в MySQL не самая позитивная идея.
1. Кроме вышеперечисленных данных, хранящихся в MySQL все остальные данные используются относительно редко:
а) при авторизации зарегенного пользователя.
б) при посмотре кем-нибудь его данных.
2. Особенности данных. Существуют несколько групп пользователей. У каждой группы пользователей, есть свои специфические поля. Т.е. если переносить в MySQL то получится очень большая таблица, в которой большинство полей будут NULL. Даже с чисто эстетической точки зрения это не очень здорово:)
3. Набор полей, предполагается, будет меняться. А постоянно удалять и добавлять поля в MySQL не слишком удачная идея. ИМХО.
-
Спасибо, сделал с помощью use Storable; В Хэшэ кстати дерево хранится.
-
glebushka:
гм, а почему бы не использовать XML? А конкретнее модуль XML::Simple?
У хостера неделю не работали некоторые модули. А данные хранились в XML. В срочно порядке пришлось переделывать код на другое хранилище :).
-
glebushka
то получится очень большая таблица, в которой большинство полей будут NULL.
Набор полей, предполагается, будет меняться. А постоянно удалять и добавлять поля в MySQL не слишком удачная идея.
При грамотном формировании БД вышеперечисленные доводы не имеют под собой основания... :) Но это моё личное мнение...
-
NeoNox
не совать грязные пальцы в рот, и заболевание кишечника тебе не грозит. Я не думаю, что ты /etc/passwd файл ложиш в место видное из веба, правильно?
правильно... :) Но по поводу хранения данных, я предпочитаю всё хранить в БД, это намного быстрее и удобнее...
-
Да и ещё... :
glebushka
Что тебе мешает создать систему из нескольких таблиц, которая будет удовлетворять свем твоим потребностям? При грамотной чятельно продуманной системе, тебе не придеться удалять и добавлять поля...
Но как говориться мы пионеры легких путей не ищем... :)
-
commander:
это намного быстрее и удобнее...
намного быстрее чего? тесты проводил или просто так сказал?