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

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

Для того чтобы выполнить упражнение, нам нужны исходные данные. Запустите текстовый редактор, наберите приведенный ниже текст и сохраните его в файле 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