Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Изучаем Perl - Шварц Р.

Шварц Р., Кристиансен Т. Изучаем Perl — Москва, 2002. — 324 c.
Скачать (прямая ссылка): izuchaemperl2002.djvu
Предыдущая << 1 .. 81 82 83 84 85 86 < 87 > 88 89 90 91 92 93 .. 124 >> Следующая

параметр не действует. Например:
dbmopen(%FRED, "mydatabase", 0644); # открыть %FRED на
mydatabase
Этот вызов связывает хеш %fred с файлами ту database.dir u mydata-
base.pag, расположенными в текущем каталоге. Если эти файлы не
существуют, они создаются с правами доступа 0644, которые модифицируются
с учетом текущего значения, установленного командой umask.
Функция dbmopen возвращает значение "истина", если базу данных можно
открыть или создать; в противном случае возвращается "ложь" - точно так
же, как при вызове функции open. Если вы не хотите создавать файлы,
используйте вместо параметра $режим значение undef. Например:
dbmopen(%А, "/etc/хх",undef) II die "cannot open DBM /etc/хх";
Это, по сути дела, просто особый случай использования общего механизма
tie. Если вам понадобится что-нибудь более гибкое, обратитесь к man-
страницам AnyDBM FHc(3). DB_File(3) и perltie(l).
218
Изучаем Perl
Если, как в данном случае, файлы /etc/xx.dir и /etc/xx.pag открыть
нельзя, то вызов dbmopen возвращает значение "ложь" без попытки создать
эти файлы.
DBM-массив остается открытым в течение выполнения всей программы. Когда
программа завершается, разрывается и связь с DBM-базой данных. Эту связь
можно разорвать и способом, близким к закрытию дескриптора файла - с
помощью функции dbmclose:
dbmclose(%А) ;
Как и функция close, dbmclose возвращает значение "ложь", если что-нибудь
происходит не так, как надо.
Использование DBM-хеша
После открытия базы данных обращения к DBM-хешу преобразуются в обращения
к базе данных. Изменение значения в хеше или ввод в него нового значения
вызывает немедленную запись соответствующих элементов в файлы на диске.
Например, после открытия массива %fred из предыдущего примера мы можем
обращаться к элементам базы данных, вводить в нее новые элементы и
удалять существующие:
$FRED{"fred"} = "bedrock"; # создать (или обновить) элемент
delete $FRED{"barney"}; # удалить элемент базы данных
foreach 5key (keys %FRED) { # пройти по всем значениям
print "5key 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, стоящий в конце
возвращаемых значений, иначе данные не будут иметь смысла.
77. Работа с пользовательскими базами данных
219
Например, чтобы найти имя merlyn в базе данных псевдонимов, можно сделать
так:
dbmopen(%ALI, "/etc/aliases", undef) M die "no aliases?";
$value = $ALI{"merlyn\0"}; # обратите внимание на добавленный NUL
chop($value); # удалить добавленный NUL
print "Randal's mail is headed for: $value\n"; # показать результат
В вашей версии UNIX база данных псевдонимов может храниться не в каталоге
/etc, а в каталоге /usr/lib. Чтобы выяснить, где именно она хранится,
придется провести маленькое расследование. Новые версии sendmail этим
NUL-дефектом не страдают.
Базы данных произвольного доступа с записями фиксированной длины
Еще одна форма хранения данных - файл на диске, предназначенный для
записей фиксированной длины. В этой схеме данные состоят из ряда записей
одинаковой длины. Нумерация этих записей либо не имеет значения, либо
определяется по какой-нибудь схеме индексации.
Например, у нас может быть ряд записей со следующими данными: 40 символов
- имя, один символ - инициал, 40 символов - фамилия и двухбайтовое целое
- возраст. Таким образом, длина каждой записи составляет 83 байта. Если
бы мы читали все эти данные в базе данных, то делали бы это порциями по
83 байта до тех пор, пока не добрались до конца. Если бы мы хотели
перейти к пятой записи, то мы пропустили бы четыре раза по 83 байта (332
байта) и прочитали бы непосредственно пятую запись.
Perl поддерживает программы, которые используют файл с подобными
записями. Помимо того, что вы уже знаете, понадобятся еще несколько
операций:
1. Открытие файла на диске для чтения и записи.
2. Переход в этом файле на произвольную позицию.
3. Выборка данных фиксированной длины, а не до следующего символа новой
строки.
4. Запись данных блоками фиксированной длины.
В функции open перед спецификацией, задающей способ открытия файла (для
чтения или записи), необходимо записать знак плюс, указав таким образом,
Предыдущая << 1 .. 81 82 83 84 85 86 < 87 > 88 89 90 91 92 93 .. 124 >> Следующая