Глава 17: Работа с пользовательскими базами данных.
17.3 Использование DBM-хеша
После открытия базы данных обращения к DBM-хешу преобразуются в обращения к базе данных. Изменение значения в хеше или ввод в него нового значения вызывает немедленную запись соответствующих элементов в файлы на диске. Например, после открытия массива %fred из предыдущего примера мы можем обращаться к элементам базы данных, вводить в нее новые элементы и удалять существующие:
$FRED{"fred"} = "bedrock"; # создать (или обновить) элемент
delete $FRED{"barney"}; # удалить элемент базы данных
foreach $key (keys %FRED) { # пройти по всем значениям
print "$key has value of $FRED{$key)\n";
}
Последний цикл должен просмотреть весь файл на диске дважды: один раз для выборки ключей, а второй — для поиска значений, соответствующих этим ключам. Если вы просматриваете DBM-хеш, то более эффективным способом с точки зрения эксплуатации диска является использование операции each, которая делает всего один проход:
while (($key, $value) = each(%FRED) ) {
print "$key has value of $value\n";
}
Если вы обращаетесь к системним DBM-базам данных, например к базам данных, созданным системами sendmail и NIS, вы должны иметь в виду, что в плохо написанных С-программах в конце строк иногда стоит символ NUL (\0). Программам библиотеки DBM этот NUL не нужен (они обрабатывают двоичные данные с помощью счетчика байтов, а не строки с символом NUL на конце), поэтому он хранится как часть данных. В таком случае вы должны добавлять символ NUL в конец своих ключей и отбрасывать NUL, стоящий в конце возвращаемых значений, иначе данные не будут иметь смысла.
Например, чтобы найти имя merlyn в базе данных псевдонимов, можно сделать так:
dbmopen(%ALI, "/etc/aliases", undef) || die "no aliases?";
$value = $ALI {"merlyn\0" 1; # обратите внимание на добавленный NUL
chop($value) ; # удалить добавленный NUL
print "Randal's mail is headed for: $value\n"; # показать результат
В вашей версии UNIX база данных псевдонимов может храниться не в каталоге /etc, а в каталоге /usr/lib. Чтобы вияснить, где именно она хранится, придется провести маленькое расследование. Новые версии sendmail этим NUL-дефектом не страдают. ''
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|