| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > попытка создать телефонный справочник |
| Автор: tooncheg 20.5.2013, 15:16 | ||
| Необходимо было изучить perl. Первоначально прочитал Рендала Шварца 5 издание и решил для тренировке создать тел. справочник. Создан файл текстовый БД вида: Сидоров Самуил Виторганович::5533::113::Бухгалтерия Петров Лев Игнатьевич::5322::114::Кадров Иванов Иван Иванович::5322::119::56 Параметры предполагалось заводить через веб форму
Задавал вопросы на схожем форуме, но в итоге все пришло к полной неразберихе. Вообщем если начать с чистого листа. Можете ли дать советы как может быть реализован поиск по БД. |
| Автор: arto 20.5.2013, 16:23 |
| читать и сравнивать. |
| Автор: tooncheg 20.5.2013, 16:36 | ||||
В том и дело алгоритм сравнения меня и ввел в тупик. Вот например:
это кусок чернового варианта. что тут получается, если равны левые и правая часть, то условие выполнится, а если я в форме ввел только номер телефона, то условие не должно выполняться (на самом деле у меня происходит поиск, по одному параметру из формы, но выводится только первое совпадение из БД). Именно так как вы предложили я и пытался решить задачу, но алгоритм сравнения оказался не так прост для меня. |
| Автор: arto 20.5.2013, 17:23 |
| а как надо? если не введен параметр, то как надо поступать? |
| Автор: vadiml 20.5.2013, 17:40 |
| Если задание отсюда https://www.reg.ru/company/jobs/testtask-prog то там надо написать используя Catalyst, а не просто голый perl. |
| Автор: tooncheg 21.5.2013, 08:41 | ||||||
Я читал строки так
далее как тут советовали сравнивать. но вот тут как раз то и становится не ясно как это осуществить.
Операция поиска совпадения по шаблону в левой части - допустим true. Операция поиска совпадения по шаблону в правой части, параметр в форме не был введен - false. Условие же не выполнится. Или я недопонимаю что-то. Я не знаю как надо поступать. Прочитать строки и сравнить, если это можно реализовать, то как это сделать. |
| Автор: arto 21.5.2013, 09:24 |
| прочитать поля в хеш (для удобства), затем map { $_ => exists $hash{$_} && param($_) eq $hash{$_} } param() получите хеш результатов сравнений существующих параметров (вместо eq можно взять регекс). далее обрабатываете как вам удобно (предполагается, что param() -- функция из CGI* модулей). А еще проще -- использовать какой-либо из валидаторов, типа Data::FormValidator |
| Автор: tooncheg 24.5.2013, 12:17 | ||||
У меня есть пару вопросов по поводу как занести данные в хэш . я изменил текстовую БД 1::Сидоров::Самуил::Виторганович::5533::113::Бухгалтерия 2::Петров::Лев::Игнатьевич::5322::114::Кадров 3::Иванов::Иван::Иванович::5322::119::56 потом читаю строки так
Но в результате хэш заполняется только последней строкой, т.е. в хэше содержится только последняя строка 3::Иванов::Иван::Иванович::5322::119::56 И вообще правильно ли я Вас понял, как надо прочитать поля в хэш? |
| Автор: alezzz 24.5.2013, 12:43 | ||
|
| Автор: tooncheg 28.5.2013, 11:54 | ||
Я извиняюсь. Просто потратил кучу времени, а справочник создать не получается даже после совета arto.
Как реализовать сравнение введенного из формы и записанного в ХЭШ, и записанного в ХЭШ из текстового файла. Например, если в форме вводились данные номер телефона и фамилия с кем связан этот телефон, то выводились данные конкретного человека. Заранее спасибо. |
| Автор: arto 28.5.2013, 12:26 |
| map { ( $form{$_} || "" ) eq ( $file{$_} || "" ) } keys %form |
| Автор: ginnie 28.5.2013, 12:37 |
| tooncheg, напишите, как Вы представляете поиск, т.е. что вводится в поля и что должно быть выведено в качестве результата поиска (нужны примеры). |
| Автор: tooncheg 28.5.2013, 15:51 | ||
Самая простая форма. 6-ть полей куда вносятся данные для поиска Имя,Фамилия,Отчество,Отдел,Комната,Телефон. <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <head><title>ФОРМА</title></head> <body> <h2>Заполните форму для поиска</h2> <br> <form method="get" action="http://site.ru/perl/form_temp.pl"> <pre> Введите имя: <input type="text" name="name"> Введите фамилию: <input type="text" name="surname"> Введите отчество: <input type="text" name="patronymic"> Введите отдел: <input type="text" name="department"> Введите комнату: <input type="text" name="room"> Введите телефон: <input type="text" name="phone"> <input type=submit value=Поиск> </form> <body> <html> Данные передаются в скрипт form_temp.pl , модуль CGI помогает принять значения. В поля вводятся либо остаются пустыми ИМЯ ФАМИЛИЯ ОТЧЕСТВО ОТДЕЛ КОМНАТА ТЕЛЕФОН. Например ввод ИМЕНИ ТЕЛЕФОНА ОТДЕЛА далее сравнение по текстовой БД и вывод ФАМИЛИИ ИМЕНИ ОТЧЕСТВА ТЕЛЕФОНА...я представляю это типа выборки по введенным параметрам, но как сделать не знаю. |
| Автор: ginnie 28.5.2013, 16:41 | ||
tooncheg, вот мой вариант без CGI и для текста в кодировке cp1251:
|
| Автор: tooncheg 30.5.2013, 10:01 | ||||
| ginnie Мне не очень понятны несколько строк
$person если его вывести на экран, то это будут ссылки на то где хранится в памяти хэш. Что в реальности происходит тут? Еще не понял для чего нужен еще {number}.
Что происходит тут? Прошу отнестись снисходительно, т.к. я только учусь. Заранее спасибо. |
| Автор: ginnie 30.5.2013, 11:54 | ||
| tooncheg, хэш позволяет нам получать определенные данные из набора по ключу. Это свойство мы используем для организации поиска. Для того, чтобы искать по номеру телефона, надо создать хэш, где ключем будет номер телефона, а значениями данные о людях. Т.к. один номер может быть у нескольких человек, значение в хэше будет массивом. Кроме номера телефона, поиск также может осуществляться по другим полям, поэтому будет несколько хэшей (равно количеству полей для поиска). Чтобы не дублировать в каждом хэше данные о людях, будем в значении хранить только идентификатор человека ($number) и добавим еще один хэш, где ключами будут идентификаторы, а значениями - данные о человеке ($directory{number}{$number} = $person;) Все используемые хэши я оформил в едином хранилище, которое также представляет собой хэш %directory, в котором ключами являются названия полей.
Добавляем в данные для поля $key по ключу lc($value) идентификатор пользователя $number. lc используем для того, чтобы поиск был независимым от регистра. Если еще есть какие-нибудь вопросы, не стесняйтесь задавать! |
| Автор: tooncheg 5.6.2013, 09:32 |
| ginnie поясните пожалуйста строку из кода $results{$number}++; В бест пректисе встречалась подобная структура, но не смог разобраться. |
| Автор: krypt3r 5.6.2013, 11:08 |
| Инкремент элемента хэша %results с ключом $number |
| Автор: ginnie 5.6.2013, 11:42 |
| tooncheg, алгоритм поиска такой: допустим задано три поля для поиска, выполняем отдельно по каждому заданному значению поиск в соответствующем кэше. Результатом выборки из кэша будут идентификаторы людей (в выборке они не повторяются). На каждом из трех этапов увеличиваем на единицу значение в хэше результатов для найденных идентификаторов. После трех этапов поиска выбираем из данных хэша результатов идентификаторы, у которых значение равно количеству этапов. Если алгоритм понятен, попробуйте дописать программу, выводя кроме полного совпадения, еще и результаты, которые были ближе всего к полному совпадению (т.е. совпали не все поля). |
| Автор: tooncheg 5.6.2013, 13:38 | ||
Это понятно Что происходит? Если Значение хеша undef , т.е. 0 идет приращение на 1цу ? |
| Автор: tooncheg 10.6.2013, 13:58 | ||||
ginnie,
вроде работает. Появился вопрос. Каким образом происходит объединение в этой строке join('::', @{$directory{number}{$number}}{qw{surname name patronymic phone room otdel}}) не понимаю последовательность происходящего там. |