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