Поиск

Пример: программная реализация записной книжки

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

Для запроса к программе memopad вводится название темы с вопросительным знаком. Чтобы занести в программу новую информацию, наберите фразу в виде X is У, где X— название темы, а У — информация, которая должна ассоциироваться с этой темой. Для поиска информации в базе данных используется запрос "like шаблон?", где шаблон — это регулярное выражение, используемое для поиска нужной темы. В результате выполнения запроса программа выведет список всех тем, соответствующих шаблону. Для выхода из программы наберите quit. Благодаря использованию хэшей, связанных с DBM-файлами, вся вводимая в профамму memopad информация будет запоминаться на диске и восстанавливаться при повторном запуске этой программы.

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

  • Строки 1—2. С этих двух строк начинается практически любая программа на Perl. Ключ -w активизирует режим вывода предупреждений, а оператор use strict используется для ужесточения контроля интерпретатора Perl над ошибками в программе и выявления плохого стиля программирования.
  • Строка 6. Выполняется привязка хэша %answers к DBM-файлу answers с помощью функции dbmopen. В результате на диске создаются два файла — answers.pag и answers.dir.
  • Строка 7. Оператор while(l) задает бесконечный цикл. Для завершения работы цикла и программы в теле цикла используется оператор last.
  • Строка 9. Эта строка может вас сбить с толку, поскольку в ней выполняется сразу несколько операций. С помощью функции 1с введенная пользователем строка преобразуется к нижнему регистру. Поскольку оператор <STDIN> используется в скалярном контексте функции 1с, из стандартного устройства ввода читается одна строка, ее символы преобразуются к нижнему регистру и результат присваивается переменной $_. С помощью функции chomp из строки $_ удаляются символы перехода на новую строку.
  • Строка 10. Если во входной строке содержится единственное слово quit, работа цикла while завершается.
  • Строка 11. Если во входной строке (она находится в переменной $_) будет найдено слово like, после которого следует текст, заканчивающийся вопросительным знаком, то сам текст помещается в переменную (в шаблоне используется группировка с помощью круглых скобок).
  • Строка 12. Строка, помещенная оператором поиска по шаблону в переменную , сохраняется для дальнейшего использования в переменной $pattern.
  • Строки 13-17. Выполняется последовательный просмотр всех ключей хэша %answers в поисках ключа, который соответствует строке, находящейся в переменной $pattern. По мере нахождения ключей они выводятся на печать.
  • Строка 18. Эта строка является продолжением оператора if, начало которого находится в 11 строке. В ней проверяется, не содержится ли в конце введенной пользователем строки вопросительный знак. При соответствии шаблону часть строки до вопросительного знака сохраняется в переменной .
  • Строка 19. Строка, помещенная оператором поиска по шаблону в переменную , сохраняется для дальнейшего использования в переменной Ssubject.
  • Строки 20—24. Если в хэше %answers существует ключ, имя которого находится в переменной Ssubject, сам ключ и ассоциированные с ним данные выводятся на печать. В противном случае программа выводит сообщение, что по указанной теме ей ничего не известно.
  • Строки 25—27. Строка 25 является продолжением оператора if, начало которого находится в 11 строке. В ней проверяется, соответствует ли введенная строка формату X is Y. При положительном ответе часть X запоминается в переменной $subject, а часть У — в $info.
  • Строка 28. Информация, находящаяся в переменной $info , запоминается в хэше %answers в ключе, имя которого находится в переменной $subject.
  • Строка 34. С помощью функции dbmclose разрывается связь хэша %answers с DBM-файлом.