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; #
и базу данных
После того как база данных DBM создана, мы можем обрабатывать в ней данные, используя функции работы с хэшами, хорошо знакомые нам из лекции 6. Например, так будет выглядеть поиск по ключу:
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}; # считываем и
my %record = %{ thaw($serialized) }; # "размораживаем"
Для перебора всех записей файла DBM можно пользоваться функциями keys и each, а для удаления записи - применить функцию delete.
С широким распространением персональных компьютеров стал популярным формат баз данных, применяемый в "настольных" СУБД dBASE, Clipper и FoxPro, семейство которых обобщенно называется XBase. Базы данных в этом формате хранятся в таблицах с суффиксом DBF (Database File), а для работы с записями такой таблицы широко применяется произвольный доступ к отдельным записям и перебор записей в цикле. (Хотя работать с ними можно также при помощи языка реляционных запросов SQL.) Одно из средств для работы с DBF-таблицами в программах на Perl - это модуль XBase, который можно загрузить из хранилища модулей CPAN. Он предоставляет объектный интерфейс для создания и изменения баз данных в формате XBase. Например, программа создания таблицы DBF будет выглядеть так:
use XBase; # модуль работы с БД в формате DBF
my $table = XBase->create( # метод создания таблицы
"name" => "mollusc.dbf", # имя файла
# имена полей (колонок, столбцов) таблицы:
"field_names" => ["ID", "NAME", "LATIN", "AREA"],
# типы данных (N - число, C - строка, D - дата):
"field_types" => [ "N", "C", "C", "C"],
# максимальные длины полей:
"field_lengths" => [ 5, 35, 30, 45],
# длины дробной части (для чисел):
"field_decimals" => [ 0, undef, undef, undef]
);
$table->close; # метод закрытия файла БД
Далее
потребуется программа добавления данных в созданную таблицу из текстового файла. Например, такая:
use XBase; # модуль работы с БД в формате DBF
my $table = new XBase "mollusc.dbf" # конструктор DBF
or die Xbase->errstr; # обработка ошибок
my $recno = 0; # добавляемые записи нумеруются с нуля
open my $text, '<', 'mollusc.txt' or die; # файл, откуда
while (my $data = <$text>) { # читаем данные,
chomp($data); # удаляя \n
# и разбивая строку на поля по разделителю ';':
my ($id, $name, $latin, $area) = split(';', $data);
# добавляем запись, указывая поля в порядке создания
Модуль XBase предоставляет все необходимые методы для работы с таблицами баз данных. Многие из них основаны на возможности произвольного доступа к любой записи DBF-файла по ее номеру. Например, таким образом можно прочитать, изменить или удалить запись по номеру $record_number:
# считать запись в хэш, с доступом к нему по ссылке:
my $hash_ref = $table->get_record_as_hash($record_number);
По поводу двух последних операций нужно сделать следующее пояснение. Дело в том, что записи в DBF-файле не удаляются физически, а только помечаются как удаленные. "Логически" удаленные записи игнорируются при обработке данных, но существуют в таблице "физически". Поэтому запись, помеченную как удаленная, можно восстановить для дальнейшей обработки. Один из способов прочитать записи таблицы - выбрать их во временный список записей, называемый курсором, откуда последовательно извлекать их в цикле. Это делается так:
my $cursor = $table->prepare_select("NAME", "LATIN", "AREA");
while (my @record = $cursor->fetch) { # прочитать запись
print "@record\n"; # обработать запись
}
В модуле XBase реализовано много других методов для работы с DBF-файлами и дополняющими их индексными файлами, которые предназначены для организации быстрого поиска записей в таблице.
Но разработчики программного обеспечения давно пришли к выводу, что вместо специфических форматов данных и операций по их обработке (без которых, конечно, иногда нельзя обойтись) гораздо перспективнее применять универсальные подходы, основанные на унифицированном доступе к базам данных на базе языка SQL.