Анимация
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

Если 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