Анимация
JavaScript
|
Главная Библионтека В этом упражнении мы выполним поиск в базе данных клиентов. Предполагается, что база данных уже создана, однако пока в ней не предусмотрены средства модификации записей. В нашем примере мы предоставим пользователю возможность поиска информации в двух различных полях. Для того чтобы выполнить упражнение, нам нужны исходные данные. Запустите текстовый редактор, наберите приведенный ниже текст и сохраните его в файле customers.txt. Обратите внимание, что количество пробелов между столбцами не имеет особого значения. В большинстве случаев будет достаточно одного пробела. Smith,John (248)-555-9430 jsmitheaol.com Hunter,Apryl (810)-555-3029 aprilishowers.org Stewart,Fat (405)-555-8710 patsSstarfleet.co.uk Ching,Iris (305)-555-0919 ichinggzen.org Doe,John (212)-555-0912 idoemorgue.com Jones, Tom (312)-555-3321 tj2342iaol.com Smith,John {607)-555-0023 smithepocahontas.con Crosby,Dave (405)-555-1516 crosScsny.org Johns,Раи (313)-55S-6790 pjisleepy.com Jeter,Liiida (B10)-555-8761 netlessiearthlink.net Garland,Judy (305)-555-1231 ozgalirainbow.com Наберите программу, приведенную в листинге 7.4, и сохраните ее в том же каталоге под именем Custoiuer. Не забудьте сделать файл программы выполняемым, воспользовавшись инструкциями, приведенными на 1-м занятии, "Начало работы с Perl". После этого попытайтесь запустить программу, набрав в командной строке perl Customer В листинге 7.5 содержится пример диалога с программой Customer. . Листинг 7.4. Исходн1й текст программы Customer in/perl -w 3: open(PH, "custaters.txt") or die -Овибка ip>i опфьпии custaters.txt: Sl\n; 4:while{<PH>) { 5; chomp; 6: {$nunbe, $enadl) = (£plit(/\s+/, $ ))[1,2]; 7: $Email{$email}=$ ; 8; $phoue{$aumber)=$ ; 9: } 10:close(PH); 12.-print "Для ЕЬ]}сда Ш ЕрохамУБ! нЕедпЕ q\n"; 13:vhile (1) { 14: print "\rNE£? "; 15: $number=cIl; chomp (? number); 16: $address="-; 17: if (! SnuBber ) { 18: print "Е-Ш1? 19: Saddre6S=<STDIN>; chomp($address); 20: > 21: 22 : next if {! $nunber ard ! $address) ; 23: last if {$ajmber eq c or $acess eq c; 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: if { Snumber arri esdsts SPhone{$nunber> ) { pEcint "Заказчик: 5Phone{Snumber}\n"; next; if (address ani adsts $Email{$addreEs} } { padnt "Заказчик: $Email{Saddress}\n" j next; 34: prin Мазчик не вайденЛп" 35: ne; 36:} 37:print ЛпПрогранма завершенаДп"; 1ст 7.5. Eb ofpi Customer 1: Для выхода 13 программы введите q 2: Номер? <Enter> 3: E-Mail? crosgcsny.org 4: Заказчик: Crosby, Dave (405)-555-1516 crosgcsny.org 5: 6: Номер? (305}-555-о919 7: Заказчик: Ching, Iris {305)-555-0919 ichingJzen.org 8: 9: Номер? q 10: 11: Программа завфшта. [ Проведем анализ программы. Строке. В этой строке указывается путь к интерпретатору (измените его в соответствии с конфигурацией вашей системы) и клю -w. Всегда включайте режим вгдачи предупреждений! Строка 3. Открывается файл customers.txt и ему назначается дескриптор РН. Естественно, проверяется успешность выполнения этой операции и при необходимости выводится сообщение об ошибке. Строки 4S. В цикле выполняется чтение строк из дескриптора РН (каждая строка по очереди присваивается переменной Символ перевода строки, находящийся в переменной $ , удаляется с помощью функции chomp. Строка 6. Информация, находящаяся в переменной $ разделяется по словам с помощью шаблона /\s+/, соответствующего одному или нескольким пробелам. Выражение с функцией split взято в скобки и за ним следуют две цифры в квадратных скобках. Так как нас интересуют телефонный номер и адрес электронной почты, то используются только указанные части списка, производимого функцией split, и переменным и присваива- ются соответствующие значения. 1 Часть I. Perl • Строки 7-8. Для доступа к записям о клиентах по адресу электронной почты и по номеру телефона используются два хэша: iEmail и %Phone. В первом хэше в качестве ключей используются адреса электронной почты, а во втором - номера телефонов. • Строка 10. В этой строке закрывается дескриптор рн. • Строка 13. Организовывается цикл while, выполняющий повтор блока кода. Выражение while (1) - идиома Perl для организации бесконечного цикла. Для выхода из этого цикла служит оператор last. • Строка 15. Считывается номер телефона и удаляется символ перевода строки. • Строка 20. Если номер телефона не введен, предлагается ввести адрес электронной почты. • Строка 23. Если ничего не введено, цикл повторяется. Если пользователь вводит символ q, происходит вгход из цикла. • Строка 28. Если введен допустимый телефонный номер, строка 26 кода выводит запись о клиенте. Управление передается в начало блока с помощью оператора next. • Строка 33. Если введен допустимый адрес, выводится запись о клиенте. Управление передается в начало блока с помощью оператора next. В данном примере продемонстрировано сразу несколько возможностей Perl. Хэши используются для быстрого доступа к данным посредством ключей. В Perl хэши реализованы весьма эффективно, время ответа будет приемлемым, если в базе данных содержатся тысячи или десятки тысяч записей. Кроме того, на примере этой программы показано, как можно организовать управление процессом выполнения программы в простом блоке без использования управляющих структур while, do, until и им подобным. Резюме Хэши предоставляют программисту Perl множество новых возможностей. Помимо простого хранения и извлечения записей, хэши используются для обработки и анализа данных. Методы обработки массивов, хранения и получения доступа к записям имеют огромное значение. В следующих занятиях знание хэшей облегчит вам изучение таких тем, как работа с DBM-фаЙлами, сложные структуры данных, взаимодействие с системным окружением. Вопросы и ответы Можно ли хранить в элементе хэша больше одного значения, т.е. снисок, адресуемый одним ключом? Да. Для этого существует два основных способа. Первый (и довольно неудобный) состоит в форматировании значения элемента в виде обычной записи, например списка с элементами, разделенными запятыми. Для преобразования списка в хэш используется функция join, а при извлечении значения из хэша скаляр разделяется функцией split. Этот метод неудобен и его реализация часто сопровождается ошибками. 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 |