ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Базы данныхВведениеБазы данных встречаются везде, где происходит обработка данных. На простейшем уровне базой данных можно считать любой файл, а на самом сложном - дорогую и сложную реляционную базу данных, обрабатывающую тысячи транзакций в секунду. Между этими полюсами расположены бесчисленные механизмы ускоренного доступа к более или менее структурированным данным. Perl поддерживает работу с базами данных на любом из этих уровней.На заре компьютерной эпохи люди заметили, что базы данных на основе плоских файлов плохо подходят для работы с большими объемами информации. Плоские файлы улучшались посредством введения записей фиксированной длины или индексирования, однако обновление требовало все больших затрат, и некогда простые приложения увязали в болоте ввода/вывода. Умные программисты почесали в затылках и разработали более удачное решение. Поскольку хеш, находящийся в памяти, обеспечивает более удобный доступ к данным по сравнению с массивом, хеш на диске также упростит работу с данными по сравнению с "массивообразным" текстовым файлом. За ускорение доступа приходится расплачиваться объемом, но дисковое пространство в наши дни стоит дешево (во всяком случае, так принято считать). Библиотека DBM предоставляет в распоряжение программистов простую и удобную базу данных. С хешами, ассоциированными с DBM-файлами, можно выполнять те же операции, что и с хешами в памяти. В сущности, именно так построена вся работа с базами данных DBM в Perl. Вы вызываете dbmopen с именем хеша и именем файла, содержащего базу данных. Затем при любом обращении к хешу Perl выполняет чтение или запись в базе данных DBM на диске. Рецепт 14.1 демонстрирует процесс создания базы данных DBM, а также содержит рекомендации относительно ее эффективного использования. Хотя с файла- 1 ми DBM допускаются все операции, разрешенные для простых хешей, возникают проблемы быстродействия, неактуальные для хешей в памяти. Рецепты 14.2 и 14.4 разъясняют суть этих проблем и показывают, как справиться с ними. С файлами DBM также можно выполнять операции, недоступные для обычных хешей. Два примера таких операций рассматриваются в рецептах 14.6 и 14.7. Разные реализации DBM обладают разными возможностями. Старая функция dbmopen позволяла использовать лишь ту библиотеку DBM, с которой был построен Perl. Если вы хотели использовать dbmopen для чтения базы данных одного типа и записи в другой тип - считайте, что вам не повезло. Положение было исправлено в Perl версии 5, где появилась возможность связать хеш с произвольным классом объекта - см. главу 13 "Классы, объекты и связи". В следующей таблице перечислены некоторые доступные библиотеки DBM.
1 Применение кода с общей лицензией GPL в программах должно удовлетворять
некоторым условиям. За дополнительной информацией обращайтесь на www.gnu.org.
14.1. Создание и использование DBM-файлаПроблемаВы хотите создать, заполнить, просмотреть или удалить значения из базы л.ж ных DBM.РешениеВоспользуйтесь функцией dbmopen или tie, чтобы открыть базу и сделать ее доступной через хэш. Затем работайте с хэшем, как обычно. После завершения работы вызовите dbmclose или untie.dbmopen use DB_File: # необязательно; переопределяет # стандартный вариант dbmopen %HASH, FILENAME, 0666 # открыть базу данных через %НАSН or die "Can't open FILENAME: $!\n"; $V = $HASH{KEY}; # Получить данные из базы $HASH{KEY} = VALUE; # Занести данные в базу if (exists $HASH{KEY}) { # Проверить наличие данных в базе # . . . } delete $HASH{KEY}; dbmclose %HASH; tie use DB File; # Удалить данные из базы # Закрыть базу данных # Загрузить модуль баз данных tie %HASH, "DB_File", FILENAME # Открыть базу данных or die "Can't open FILENAME: $!\n"; # через %HASH $V = $HASH{KEY}; # Получить данные из базы $HASH{KEY} =o VALUE; # Занести данные в базу if (exists $HASH{KEY}) { # Проверить наличие данных в базе # . . . } delete $HASH{KEY}; # Удалить данные из базы untie %hash; # Закрыть базу данных КомментарийРабота с базой данных через хэш отличается широкими возможностями и простотой. В вашем распоряжении оказывается хэш, состояние которого сохраняется и после завершения программы. Кроме того, он работает намного быстрее, чем хэш, полностью загружаемый при каждом запуске; даже если хэш состоит из миллиона элементов, ваша программа запустится практически мгновенно.Программа из примера 14.1 работает с базой данных так, словно она является обычным хэшем. Для нее даже можно вызывать keys или each. Кроме того, для связанных DBM-хэшей реализованы функции exists и defined. В отличие от обычного хэша, для DBM-хеша эти функции идентичны. Пример 14.1. userstats #!/usr/bin/perl -w # userstats - вывод статистики о зарегистрированных пользователях. # При вызове с аргументом выводит данные по конкретным пользователям. use DB_File; $db = '/tmp/userstats.db'; # База для хранения данных между запусками tie(%db, 'DB_File', $db) or die "Can't open DB_File $db : $!\n": if (@ARGV) { if ("@ARGV" eq "ALL") { @ARGV = sort keys %db; } foreach $user (@ARGV) { print "$user\t$db{$user}\n"; } } else { @who = 'who'; # Запустить who(1) if ($?) { die "Couldn't run who: $?\n"; # Аварийное завершение } # Извлечь имя пользователя (первое в строке) и обновить foreach $line (@who) { $line =- /"(\S+)/; die "Bad line from who: $line\n" unless $1, $db{$1}++; } } untie %db; Мы воспользовались командой who для получения списка зарегистрированных
пользователей. Обычно результат выглядит следующим образом:
|