Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [ 71 ] 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

Обработка данных в Perl


До сих пор мы рассматривали программы, в которых исходные данные вводились в

процессе диалога с пользователем или из файла, а результат вычислений отображался

на терминале. Но вы когда-нибудь задумывались над вопросом: "Что происходит с данными, полученными в результате работы программы, после ее завершения?" Ничего особенного, они попросту теряются, будто ничего и не было. Таким образом, при следующем запуске программы нужно начинать все вычисления сначала.

Вот тут-то на помощь и приходят базы данных. Они используются для хранения данных, предназначенных для последующей обработки. Более того, правильно спроектированная база данных может использоваться многими программами для выполнения запросов, создания всевозможных отчетов и ввода данных. Перед разработкой базы данных вы должны тщательно продумать ее структуру и определить способы хранения данных. Есть еще одна немаловажная деталь, которую нужно иметь в виду, - метод доступа к данным: будет ли с базой данных работать один человек, или

необходимо обеспечить доступ одновременно для нескольких пользователей.

На этом занятии мы рассмотрим несколько способов хранения данных, предназначенных для дальнейшего использования. Основные темы этого занятия.

• Создание DBM-файлов и хранение данных в них.

• Использование в качестве базы данных обычного текстового файла.

• Произвольный доступ к данным, хранящимся в файлах.

• Блокировка данных в файле для предотвращения одновременного доступа к

ним нескольких пользователей.

Файлы DBM

При программировании Perl использование DBM-файлов является самым простым способом хранения структурированных данных. Файлы DBM обладают одним замечательным свойством - в программах на Perl их можно напрямую связать с хэ-

II. углублмся E Perl



шем. При этом чтение и запись сводится к простым операциям с хэ-

шем, о которых шла речь на 7-м занятии, "Хэши".

Чтобы связать хэш с DBM-файлом, в Perl используется функция dbmopen, синтаксис которой выглядит так:

dbmopen(хэя, имя файла, права доступа)

В результате выполнения этой функции указанный вами хэш подключается к DBM-файлу. Параметр имя файла на самом деле определяет два файла на жестком диске: рад и Они используются Perl для хранения данных в

иерархическом виде и быстрого доступа к ним. Эти файлы не являются текстовыми, поэтому их нельзя редактировать с помощью обычного текстового тора. Кроме того, не обращайте внимания, если один из файлов имеет нулевую длину или его размер слишком велик по сравнению с сохраненными в нем данными. Это вполне нормальное явление.

Третий параметр функции dbmopen определяет права доступа, которые назначаются двум DBM-файлам при их создании. При работе в системе UNIX всегда используйте осмысленные значения праз доступа. Это позволит контролировать доступ к вашим DBM-файлам Например, значение кода прав доступа, равное 0666, обеспечивает доступ по чтению и записи к вашим DBM-файлам для всех пользователей данного компьютера; значение 0644 позволяет вам читать и записывать данные, в то время как для

остальных пользователей обеспечивается только режим чтения. При работе в системе

Windows данный параметр не играет особой роли, поскольку в ней не предусмотрены средства управления доступом. Поэтому всегда используйте значение 0666.

Функция dbmopen возвращает истинное значение, если операция подключения хэша к DBM-файлу прошла успешно. А теперь давайте рассмотрим пример:

dbmopen(%hash, -dbnflie, 0644)

dig "01кбкапрн ащыпиПВМ-файла: $!";

После выполнения этого оператора устанавливается связь хэша с DBM-

файлом dbmfile. Для хранения хэша на диске Perl создает два файла: dbrafile.pag и dbmfile.dir. Если в последующих операторах значение элементов хэша будет изменено (как показано ниже на примере), автоматически обновит соответствующие DBM-файлы:

$hash{E0iia4bB}=K0BEa; 5hash{собачьи}=co6ai!:a";

Обращение к элементам хэша автоматически приводит к считыванию информации из DBM-файла, например:

print $hash{собачьи};

Чтобы разорвать связь хэш ash с DBM-файлом, используется функция tibmclose: dbmclOBe(thaBh);

После выполнения этой функции элементы хэша шчьи и чьи останутся в DBM-файле. В результате нри следующем запуске программы и связывании хэша %hash с DBM-файлами значение указанных элементов хэша будет восстановлено.

С хэшами, связанными с DBM-файлами, можно выполнять те же операции, что и с обычными хэшами, например использовать функции keys, values и delete. Чтобы очистить хэш (и соответственно присвойте ему пустой список, как пока-

зано ниже:

15-й час. Обработка дак 231



%liasi2=();

Чтобы инициализировать хэш и соответствующий ем Ш-файл, после выполнения функции dbmopen присвойте ей нужные значения в списке.

Некоторые важные замечания

В этом разделе мы приведем несколько полезных замечаний, которые нужно иметь в виду при связывании хэша с DBM-файлом.

• Ограничение на длину ключей и данных. Хотя не накладывается никаких специальных ограничений на длину ключей и данных хэша, тем не менее, при связывании с DBM-файлом суммарный размер одного ключа и хранимых в нем данных не должен превышать 1Q24 символа. Это ограничение обусловлено структурой DBM-файла. На общее число ключей в хэше не накладывается никаких ограничений, оно зависит только от типа используемой файловой системы.

• После выполнения функции dbmopen первоначальные значения элементов хэша теряются. Поэтому лучше всего для операции связывания выбирать чистыйхэш. Рассмотрим следующий пример:

«h=();

$h{одиогорбые}="верблюд; dbmopenftb, "dbnfil" Ж4)

die -ошибка щк отарнФяи ГШ-айта: $1"; print $h{ одногорбые}; t Нижго ж будет ШЕвтаганэ dbmcloee(th);

В этом примере после выполпепия функции dbmopen ключ одногорбые хэща теряется.

• После выполнения функции lose значения ключей связанного хэша теряются. Вот пример:

dbmopen(th, "dbmfiLe", 0644) 11

die "01к6ка при отхрнтня ОВМ-фа£па: $ 1"; Sh{ парнокопытвые }=корова"; dbniclose(»h);

pcln пытяые], ььрзего не чазв

В этом примере новый ключ парнокопьпные будет добавлен к DBM-файлу. Однако после выполнения функции все ключи связанного хэша те-

ряются, а хэш полностью очищается.

Обработка больших DBM-файлов

Предположим, что некоторый хэщ связан с DBM-файлом. Для определенности будем считать, что вы нищете на Perl программу, которая сохраняет в файле сведения о сотрудниках: фамилия, должность, номер телефона и др. Очевидно, что если сотрудников достаточно много, то через некоторое время ваш хэш станет очень большого размера. Причина заключается в том, что каждый раз при запуске программы ее значения восстанавливаются из DBM-файла, добавляются в хэш и снова записываются в файл при завершении программы. Таким образом, если вы не предпримете специальных действий, значения из вашего хэша никогда не будут автоматически удаляться.

232 Чть П. углубляемся e Perl



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [ 71 ] 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122