Анимация
JavaScript
|
Главная Библионтека Если DBM-файл, называемый records, имеет большое количества маиии, то при выполнении приведенного ниже фрагмента программы могут возникнуть проблемы. dbmopen(»recB, "record", 0644) Jl die "СПи пЕи сльпии Г-йл record: $1" ; foreach пу $1 {teys Irece) { pdnt " $teir= 5recs{$key}\n; dbinclose( trees); He ищите ошибку в коде, ее там нет! Вначале выполняется связывание хэша *recs с DBM-файлом, затем с помощью оператора keys *recs из пего извлекается список всех ключей, после чего в цикле foreach my $key распечатывается ключ и соответствующее ему значение. Если список ключей хэша велик, оператор keys может выполняться доста- точпо продолжительпое время и завершиться аварийно из-за нехватки оперативной памяти. Поэтому в Perl предусмотрена еше одна функция, предназначенная для обработки элементов хэша по одному за раз. Она называется each. Ее синтаксис выглядит так: ($MJD¥, $ значение) =еасЬ(1хэи); Функция each возвращает список, состоящий из двух элементов, - ключа и его значения, извлеченных из хэша. При каждом вызове этой функции она возвращает из хэша очередную пару ключ-значение. Если ключи в хэше исчерпаны, функция возвращает пустой список. Таким образом, приведенный выше фрагмент кода можно переписать так, чтобы с его помощью можно было обрабатывать хэши большого размера: dbBopen(lrecs, "record", 0644) die "Qipfia щк апыгия ЕВЬайпа record: $!"; vhile( (Sfcey, $value)=each %геев) { print $квг= 5value\n-; (Ibmclose(lrecs); Функцию each можно использовать для перебора элементов любого хэша, а не только того, который связан с РВМ-файлом. Пример: программная реализация записной книжки Теперь, после того как вы научились сохранять данные программы на диске, самое время найти полученным знаниям достойное применение. В этом примере мы рассмотрим программную реализацию электронной записпой книжки. Программа называется mmicpad, а ее текст приведен в листинге 15.1. Информация в занисной книжке хранится в виде хэша, что нозволяет получить к пей быстрый доступ с помощью простых запросов. Пример сеанса работы с программой mmicpd приведен в листинге 15.2. Для запроса к программе memopad вводится название темы с вопросительным знаком. Чтобы занести в программу новую информацию, наберите фразу в виде X is У, где X - название темы, У - информация, которая должна ассоциироваться с этой темой Для поиска информации в базе данных используется запрос "like шаблон?", где шаблон - это регулярное выражение, используемое для поиска нужное TCMbt. В результате выполнения запроса программа выведет список всех тем, соответствующих шаблону. Для выхода из программы наберите quit. Благодаря использованию хэшей, связанных с DBM-файлами, вся вводимая в профамму mopad информация будет запоминаться на диске и восстанавливаться при повторном запуске этой программы. ст15.1. Иой текст ограммы ed 1: *J/usr/local/perl -v 2: use strict; 3: 4: шу(Answers, $SL±7iect, $info, pattern) ; 5: 6: dbmopen(%answers, "агЕкеш", 0644) [ die "CtofiKa Epi открытии DBM-файла answers: $1"; 7: while{l) { 8: print "Ввеорпе згюрсс или quit для ы,1хода: "; 9: chomp($ =lc(<STDIN>)); 10: last if (/quit$/); 11: if (/llke\s+(.*)\7/) { 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 29: 30: 31: 32: 33: $pattem=$l; while( (Ssubject,5info)=each(%answers) ) { if (Ssubject=-/Spattern/) { print "ПШхн $pittem вспрэ1ипся в 5subject\n"; } elsif(/(.*J\?/) { $subject=$l; if ($ansKers{$sutJ€ct}) { print "{sLtjject - это $answers{$subject}\n-; } else { print "фо $SL±jie± ШМ НИШГО H2 нзвестно\п"; } elsif(/(.*)\sis\s(.*)/) { $subje±=$l; $in£o=S2; Sanswers{$subject}=$info; pint "ti запомни, что ject - $info\r"; } else { pint "Сибсиньй запрос\п"; dbmclose(%answers}; ист15.2. злер диалога с )ограмой memoped пцте запр Р1ги uit для вькод: jer]? Про perl наи ничего не извеисю Ввечпе запрос кши quit для ы>1хода: perl is язьк грограмугрования запомилк, что pel - это язьк программировании пцте запрос Р1ги t для вькода: VktrcsEBSQ perl is tp: w*w.pEr].org Ны захмнипи, что тексфвф perl - это http:/Алда.perl.org Чть II. углубляемся e Perl Введите запрос или quit для в1хода: perl? perl - это язык программирования Введите запрос или quit для выхода: like perl? ПМиш perl встретился в perl ПМтсн perl встретился в web-сервере perl Введите запрос иди quit для .выхола: quit Проведем „v,i4,- анализ программы. • Строки 1-2. С этих двух строк начинается практически любая программа на Perl. Ключ -w активизирует режим вывода предупреждепий, а оператор use strict используется для ужесточения контроля интерпретатора над ошибками в программе и выявления плохого стиля программирования. • Строка 6. Выполняется привязка хэш wers к DBM-файлу answers с помощью функции В результате на диске создаются два файла - answers.pag и answers.dir, • Строка 7. Оператор while(l) задает бесконечный цикл. Для завершения работы цикла и программы в теле цикла используется оператор last. • Строка 9. Эта строка может вас сбить с толку, поскольку в ней выполняется сразу несколько операций. С помощью функции 1с введенная пользователем строка преобразуется к нижнему регистру. Поскольку оператор <1N> используется в скалярном контексте функции 1с, из стандартного устройства ввода читается одна строка, ее символы преобразуются к нижнему регистру и результат присваивается переменной С помощью функции chomp из строки $ удаляются символы перехода на новую строку. • Строка 10. Если во входной строке содержится единственное слово quit, работа цикла while завершается. • Строка 11. Если во входной строке (она находится в переменно) будет пайдепо слово like, после которого следует текст, закапчивающийся вопросительным знаком, то сам текст помещается в переменную (в шаблоне используется группировка с помощью круглых скобок). • Строка 12. Строка, помещенная оператором поиска по шаблону в. перемен, пую $1, сохраняется для дальнейщего использования в переменной Spattern. • Строки 13-17. Выполняется последовательный просмотр всех ключей хэща %answers в поисках ключа, который соответствует строке, находящейся в переменной $pattern. По мере нахождения ключей они выводятся на печать. • Строка 18. Эта строка является продолжением оператора if, начало которого находится в 11 строке. В ней проверяется, не содержится ли в конце введенной пользователем строки вопросительный знак. При соответствии шаблону часть строки до вопросительного знака сохраняется в переменной $1. • Строка 19. Строка, помещенная оператором поиска по шаблону в переменную $1, сохраняется для дальнейшего использования в переменной Ssubject. • Строка 24. Если в хэш wers существует ключ, имя которого находится в переменной Ssubject, сам ключ и ассоциированные с ним данные 15-й час. Обраб в Perl 235 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 |