обойти ограницение $хєш{$ключ}=$значение; в DBM файле
Модератор: Модераторы разделов
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
обойти ограницение $хєш{$ключ}=$значение; в DBM файле
как правильно обойти oграницение чтобы построить базу данных на perl?;
чтобы данные не перезаписывались, ну чтобы в ключах НЕ ассоциировались только одни значения или ID,или login, или pass, или sub записать и сохранить несколько значений?
в гугле кстате, мало информации про это, везде всё одинаковое как это сделать?
____________________
| ID | login | pass | sub|
|_____|____ |_____|____|
| 001 | a | aa | aaa|
| 002 | b | bb | bbb|
|____ |_____|_____|___ |
чтобы данные не перезаписывались, ну чтобы в ключах НЕ ассоциировались только одни значения или ID,или login, или pass, или sub записать и сохранить несколько значений?
в гугле кстате, мало информации про это, везде всё одинаковое как это сделать?
____________________
| ID | login | pass | sub|
|_____|____ |_____|____|
| 001 | a | aa | aaa|
| 002 | b | bb | bbb|
|____ |_____|_____|___ |
-
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
Честно говоря плохо понял что надо, если хранить в перловой ДБ не хеш, а сложные структуры - см МЛДБМ. Обращаем особ внимание на ворнинг - там-де только ключи первого уровня поддерживают обновление значения нормально, для потомков надо пересохранять всю запись целиком. В перлдок все было.
Код: Выделить всё
#!/usr/bin/perl
use open ':locale';
use MLDBM qw(GDBM_File Storable); # DB_File and Storable
use Fcntl;
use encoding 'utf8';
my %db;
tie %db, 'MLDBM', 'texts', Fcntl::O_CREAT|Fcntl::O_RDWR, 0640 or die $!;
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
я не понял что это имееться ввиду, что значит пересохранять всю запись целиком (и какую запись?)??
ну чтобы сделать такую таблицу нужно хэш или МЛДБМ???
я сделал и записал, но в ключе получилось только oдно значнеие, тоесть только одна строка сохранилась (перезаписалась), а нужно еще ID 002 login b pass bb sub bbb, например...
-
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
Можно то, можно другое, что больше нравится. Хэш никто не мешает так построить:
'001.login' -> login,
'001.passwd' -> 's234sds',
'001.sub' -> 'Ququ'
'002.login' -> login2
только неэффективно это, если одновременный доступ ко всем значениям одного ид нужен. Лучше
001 => { login => 'asdad', passwd => 'sd3423d', sub => 'Ququ'},
002 => { login => ........ }
Вот для привязки второго к ДБМ файлу есть МЛДБМ. Первый, понятно, к ДБМ и так привязывается, без МЛ.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
доступ ко всем логин, ид, sub так как у MySQL!
спасибо, что обьяснили, я думал, что записать и сохранить и всё
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
Код: Выделить всё
65590;Перловица;unio;реки севера России и Скандинавии
56331;речная;margaritifera;север Европы
10616;жемчужница;martensii;Японское море
36816;стромбус;gigas;Куба
Код: Выделить всё
use DB_File; # модули для работы с DBM
use Storable qw(freeze thaw); # и сохранения данных
my %database; # хэш "привязывается"...
tie %database, "DB_File", "mollusc.db" or die; # ...к БД
open my $text, '<', 'mollusc.txt' or die; # файл, откуда
while (my $data = <$text>) { # читаем данные,
chomp($data); # удаляя \n
# и разбивая строку на поля по разделителю ';':
my ($id, $name, $latin, $area) = split(';', $data);
my %record = ( # заполняем поля записи БД:
ID => $id, # идентификатор экземпляра
NAME => $name, # наименование моллюска
LATIN => $latin, # латинское название
AREA => $area); # ареал обитания
my $serialized = freeze \%record; # "замораживаем"
$database{$id} = $serialized; # и сохраняем запись
}
close $text; # закрываем тестовый файл
untie %database; # и базу данных
Код: Выделить всё
use DB_File; # модули для работы с DBM
use Storable qw(freeze thaw); # и сохранения данных
my %database; # хэш "привязываем"...
tie %database, "DB_File", "mollusc.db" or die; # ...к БД
my $id = 65590; # ищем "Перловицу"
if (exists $database{$id}) { # по идентификатору
my $serialized = $database{$id}; # считываем и
%record = %{ thaw($serialized) }; # "размораживаем"
printf "%5d %s %s %s\n", # запись БД в хэш
$id, $record{NAME}, $record{LATIN};
}
untie %database; # "отвязываем" БД от хэша
# будет выведено: 65590 Перловица Unio pictorum
у меня есть $latin0="u"; мне нужно посмотреть есть ли он в базе!!!!
перебрал вот так, не печатает
Код: Выделить всё
while (($latin)= each %record) {
print $latin;
и не получаеться вывести latin
Код: Выделить всё
use DB_File;
use Storable qw(freeze thaw);
my %database;
tie %database, "DB_File", "mollusc.db" or die;
my $latin = unio;
if (exists $database{$latin}) {
my $serialized = $database{$latin};
%record = %{ thaw($serialized) };
printf "%d", $record{$latin};
}
untie %database;
в man Storable всё почти так и написано :new_ranting2: :new_ranting2: :new_alien:
-
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
gcc писал(а): ↑03.11.2007 01:54у меня есть $latin0="u"; мне нужно посмотреть есть ли он в базе!!!!
перебрал вот так, не печатает
Код: Выделить всё
while (($latin)= each %record) { print $latin;
Опять плохо улавливаю ход мыслей и суть проблемы.
Если записи сериализованы и залиты в хэш - либо вы знаете айди, достаете запись, распаковываете и обращаесь к чем вам надо; либо вы не знаете айди, тогда вы перебираете все записи по порядку, распаковываете каждую и сравниваете искомое значение с соответствующим членом записи.
Если у вас таких поисков много, по разным "столбцам", и таблица большая - есть смысл использовать полноценную БД и не мучиться. Они для того и были созданы.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
сори, но для начала я хотел вывести все latin или строку с латин
я получил от GET latin2, и хотел посмотреть есть ли он в столбце... но не получилось...
таблица не большая 2 поиска надо сделать...
ок
(мне показалось, что большой веб портал использовал dbm, при ошибке БД была надпись dbm failed)
я получил от GET latin2, и хотел посмотреть есть ли он в столбце... но не получилось...
таблица не большая 2 поиска надо сделать...
ок
(мне показалось, что большой веб портал использовал dbm, при ошибке БД была надпись dbm failed)
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
поиск сделал
не могу сделать поиск до n-го значения, нужно выполнить поиск, если 4 раза есть совпадения $razd1, то выйти...
не получаеться никак!
ЗЫ: база данных маленкьая и скрипты НЕ сложные просто добавляют, желательно этот поиск для удобаства сделать...
не могу сделать поиск до n-го значения, нужно выполнить поиск, если 4 раза есть совпадения $razd1, то выйти...
не получаеться никак!
Код: Выделить всё
open (MYFILE, "2.txt") || die "awibka";
my (@sdata)=<MYFILE>;
foreach $str (@sdata) {
($razdel, $period)=split(/;/, $str);
#chomp @sdata;
#$maxf=4
$count = 0;
while ($razdel =~ /$razd1/g) {
$count++;
}
if ($count >= 4) {
print "MAXX";
exit;
}
ЗЫ: база данных маленкьая и скрипты НЕ сложные просто добавляют, желательно этот поиск для удобаства сделать...
-
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
Не вижу закрывающей } у foreach и не понимаю что делает ваш код.
Код: Выделить всё
$razd1 = "искомое значение";
$count = 0;
foreach $str (@sdata) {
# chomp $str; # вот уж не помню надо оно тут или нет...
($razdel, $period)=split(/;/, $str);
if ($razdel =~ /$razd1/g) {
$count++;
if ($count >= 4) { break; }
}
}
Я пардон с перлом дело эпизодически имею, так что если что-то сюда из сишного диалекта заскочило то извините. Винегрет в голове из вариаций цикла фор на разных языках.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
000;ergerge;ergerwer546;ergerg546;erg@rgret.vom;wer wr456; ; ;
000;ergerg4ert;ergerwer546;ergerg546;erg@rget.vom;wer wr456;;127.0.0.1;
000;ergerg4ert;ergerwer546;ergerg546;erg@rget.vom;wer wr456;;127.0.0.1;
000;ergerg4ert;ergerwer546;ergerg546;erg@rget.vom;wer wr456;;127.0.0.1;
000;ergerg4;ergerwer546;ergerg546;erg@rg.vom;wer wr456;;127.0.0.1;
не работает
000;ergerg4ert;ergerwer546;ergerg546;erg@rget.vom;wer wr456;;127.0.0.1;
000;ergerg4ert;ergerwer546;ergerg546;erg@rget.vom;wer wr456;;127.0.0.1;
000;ergerg4ert;ergerwer546;ergerg546;erg@rget.vom;wer wr456;;127.0.0.1;
000;ergerg4;ergerwer546;ergerg546;erg@rg.vom;wer wr456;;127.0.0.1;
Код: Выделить всё
#!/usr/local/bin/perl
$a1="127.0.0.1";
open (MYFILE, "mollusc.txt") || die "awibka";
my (@sdata)=<MYFILE>;
foreach $str (@sdata) {
#while (<MYFILE>) {
$count = 0;
($idd, $log, $passswd, $cityy, $ema, $title, $sds, $ip1)=split(/;/, $str);
#chomp @sdata;
#print "$ip1";
if ($ip1 =~ /$a1/g) {
$count++;
if ($count >= 4) {
print "4 exit";
exit;
}
}
}
close(MYFILE);
не работает
-
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
Еще бы. Я вроде ясно нарисовал в алгоритме, что каунт должен быть инициализирован вне цикла.
Если вы его обнуляете на каждом проходе - откуда же там 4 совпадения-то наберется? Или я вообще не понял, что вам надо.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
Прекрасно все работает. В данном случае со стандартного входа читает.
Код: Выделить всё
$ cat _forumdb.pl
#!/usr/local/bin/perl
$a1="127.0.0.1";
# open (MYFILE, "mollusc.txt") || die "awibka";
$count = 0;
while (<>) {
chomp;
($idd, $log, $passswd, $cityy, $ema, $title, $sds, $ip1)=split(/;/, $_);
# print " [[[$ip1]]] ";
if ($ip1 =~ /$a1/g) {
$count++;
if ($count >= 4) {
print "\n\n4 exit\n";
exit;
}
}
}
# close(MYFILE);
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
- Сообщения: 526
- ОС: FreeBSD 8.0 CURRENT
Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле
спасибо!
я как всегда запутался...
я как всегда запутался...