Поиск

Упражнение: создание в Perl простой базы данных пользователей

Если вам приходилось звонить в центр гарантийного обслуживания, вы, наверное, обратили внимание, что человек на другом конце провода вначале спрашивает ваш телефонный номер, номер гарантийного талона, номер карточки социального страхования или какой-нибудь другой номер, позволяющий компьютеру вас идентифицировать. Эти номера — не что иное, как ключи базы данных, позволяющие получить доступ к информации о вас. Не правда ли, все это похоже на ключи хэшей в Perl?

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

Для того чтобы выполнить упражнение, нам нужны исходные данные. Запустите текстовый редактор, наберите приведенный ниже текст и сохраните его в файле customers.txt. Обратите внимание, что количество пробелов между столбцами не имеет особого значения. В большинстве случаев будет достаточно одного пробела.

Наберите программу, приведенную в листинге 7.4, и сохраните ее в том же каталоге под именем Customer. He забудьте сделать файл программы выполняемым, воспользовавшись инструкциями, приведенными на 1-м занятии, "Начало работы с Perl".

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

perl Customer

В листинге 7.5 содержится пример диалога с программой Customer.


Проведем анализ программы.

  • СтрокаI. В этой строке указывается путь к интерпретатору (измените его в соответствии с конфигурацией вашей системы) и ключ -w. Всегда включайте режим выдачи предупреждений!
  • Строка 3. Открывается файл customers.txt и ему назначается дескриптор РН. Естественно, проверяется успешность выполнения этой операции и при необходимости выводится сообщение об ошибке.
  • Строки 4-5. В цикле выполняется чтение строк из дескриптора РН (каждая строка по очереди присваивается переменной $_). Символ перевода строки, находящийся в переменной $_, удаляется с помощью функции chomp.
  • Строка 6. Информация, находящаяся в переменной $_, разделяется по словам с помощью шаблона /\s+/, соответствующего одному или нескольким пробелам. Выражение с функцией split взято в скобки и за ним следуют две цифры в квадратных скобках. Так как нас интересуют телефонный номер и адрес электронной почты, то используются только указанные части списка, производимого функцией split, и переменным $number и $email присваиваются соответствующие значения.
  • Строки 7-8. Для доступа к записям о клиентах по адресу электронной почты и по номеру телефона используются два хэша: %Email и %Phone. В первом хэше в качестве ключей используются адреса электронной почты, а во втором — номера телефонов.
  • Строка 10. В этой строке закрывается дескриптор рн.
  • Строка 13. Организовывается цикл while, выполняющий повтор блока кода. Выражение while (1) — идиома Perl для организации бесконечного цикла. Для выхода из этого цикла служит оператор last.
  • Строки 14—15. Считывается номер телефона и удаляется символ перевода строки.
  • Строки 17—20. Если номер телефона не введен, предлагается ввести адрес электронной почты.
  • Строки 22—23. Если ничего не введено, цикл повторяется. Если пользователь вводит символ q, происходит выход из цикла.
  • Строки 25—28. Если введен допустимый телефонный номер, строка 26 кода выводит запись о клиенте. Управление передается в начало блока с помощью оператора next.
  • Строки30—33. Если введен допустимый адрес, выводится запись о клиенте. Управление передается в начало блока с помощью оператора next.

В данном примере продемонстрировано сразу несколько возможностей Perl. Хэши используются для быстрого доступа к данным посредством ключей. В Perl хэши реализованы весьма эффективно, время ответа будет приемлемым, даже если в базе данных содержатся тысячи или десятки тысяч записей. Кроме того, на примере этой программы показано, как можно организовать управление процессом выполнения программы в простом блоке без использования управляющих структур while, do, until и им подобным.