обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Модератор: Модераторы разделов

Ответить
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение gcc »

как правильно обойти oграницение чтобы построить базу данных на perl?;
чтобы данные не перезаписывались, ну чтобы в ключах НЕ ассоциировались только одни значения или ID,или login, или pass, или sub записать и сохранить несколько значений?
в гугле кстате, мало информации про это, везде всё одинаковое :( как это сделать?

____________________
| ID | login | pass | sub|
|_____|____ |_____|____|
| 001 | a | aa | aaa|
| 002 | b | bb | bbb|
|____ |_____|_____|___ |
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение sergio »

Честно говоря плохо понял что надо, если хранить в перловой ДБ не хеш, а сложные структуры - см МЛДБМ. Обращаем особ внимание на ворнинг - там-де только ключи первого уровня поддерживают обновление значения нормально, для потомков надо пересохранять всю запись целиком. В перлдок все было.


Код: Выделить всё

#!/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
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение gcc »

sergio писал(а):
02.11.2007 20:01
Обращаем особ внимание на ворнинг - там-де только ключи первого уровня поддерживают обновление значения нормально, для потомков надо пересохранять всю запись целиком.

я не понял что это имееться ввиду, что значит пересохранять всю запись целиком (и какую запись?)??

ну чтобы сделать такую таблицу нужно хэш или МЛДБМ???
я сделал и записал, но в ключе получилось только oдно значнеие, тоесть только одна строка сохранилась (перезаписалась), а нужно еще ID 002 login b pass bb sub bbb, например...
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение sergio »

gcc писал(а):
02.11.2007 20:43
ну чтобы сделать такую таблицу нужно хэш или МЛДБМ???
я сделал и записал, но в ключе получилось только oдно значнеие, тоесть только одна строка сохранилась (перезаписалась), а нужно еще ID 002 login b pass bb sub bbb, например...


Можно то, можно другое, что больше нравится. Хэш никто не мешает так построить:
'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
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение gcc »

sergio писал(а):
02.11.2007 21:21
одновременный доступ ко всем значениям одного ид нужен

доступ ко всем логин, ид, sub так как у MySQL!
спасибо, что обьяснили, я думал, что записать и сохранить и всё :)
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение gcc »

Код: Выделить всё

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:
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение sergio »

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
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение gcc »

сори, но для начала я хотел вывести все latin или строку с латин
я получил от GET latin2, и хотел посмотреть есть ли он в столбце... но не получилось...

таблица не большая 2 поиска надо сделать...

sergio писал(а):
03.11.2007 03:09
использовать полноценную БД и не мучиться. Они для того и были созданы.

ок
(мне показалось, что большой веб портал использовал dbm, при ошибке БД была надпись dbm failed)
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение gcc »

поиск сделал


не могу сделать поиск до n-го значения, нужно выполнить поиск, если 4 раза есть совпадения $razd1, то выйти...
не получаеться никак!
:unsure: :huh:

Код: Выделить всё

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;
}


ЗЫ: база данных маленкьая и скрипты НЕ сложные просто добавляют, желательно этот поиск для удобаства сделать...
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение sergio »

gcc писал(а):
16.11.2007 18:55
не могу сделать поиск до n-го значения, нужно выполнить поиск, если 4 раза есть совпадения $razd1, то выйти...
не получаеться никак!
:unsure: :huh:


Не вижу закрывающей } у foreach и не понимаю что делает ваш код.

Код: Выделить всё

$razd1 = "искомое значение";

$count = 0;
foreach $str (@sdata) {
  # chomp $str;  # вот уж не помню надо оно тут или нет...
  ($razdel, $period)=split(/;/, $str);
  if ($razdel =~ /$razd1/g) {
    $count++;
    if ($count >= 4)  {  break;  }
  }
}


Я пардон с перлом дело эпизодически имею, так что если что-то сюда из сишного диалекта заскочило то извините. Винегрет в голове из вариаций цикла фор на разных языках. :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT
Контактная информация:

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение gcc »

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;


Код: Выделить всё

#!/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);

не работает
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение sergio »

gcc писал(а):
17.11.2007 01:41
не работает

Еще бы. Я вроде ясно нарисовал в алгоритме, что каунт должен быть инициализирован вне цикла.
Если вы его обнуляете на каждом проходе - откуда же там 4 совпадения-то наберется? Или я вообще не понял, что вам надо.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: обойти ограницение $хєш{$ключ}=$значение; в DBM файле

Сообщение sergio »

Прекрасно все работает. В данном случае со стандартного входа читает.


Код: Выделить всё

$ 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
Спасибо сказали:
Ответить