![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
tooncheg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
Необходимо было изучить perl. Первоначально прочитал Рендала Шварца 5 издание и решил для тренировке создать тел. справочник. Создан файл текстовый БД вида:
Сидоров Самуил Виторганович::5533::113::Бухгалтерия Петров Лев Игнатьевич::5322::114::Кадров Иванов Иван Иванович::5322::119::56 Параметры предполагалось заводить через веб форму
Задавал вопросы на схожем форуме, но в итоге все пришло к полной неразберихе. Вообщем если начать с чистого листа. Можете ли дать советы как может быть реализован поиск по БД. |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
читать и сравнивать.
|
|||
|
||||
tooncheg |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
В том и дело алгоритм сравнения меня и ввел в тупик. Вот например:
это кусок чернового варианта. что тут получается, если равны левые и правая часть, то условие выполнится, а если я в форме ввел только номер телефона, то условие не должно выполняться (на самом деле у меня происходит поиск, по одному параметру из формы, но выводится только первое совпадение из БД). Именно так как вы предложили я и пытался решить задачу, но алгоритм сравнения оказался не так прост для меня. |
||||
|
|||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
а как надо? если не введен параметр, то как надо поступать?
|
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
Если задание отсюда https://www.reg.ru/company/jobs/testtask-prog
то там надо написать используя Catalyst, а не просто голый perl. |
|||
|
||||
tooncheg |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
Я читал строки так
далее как тут советовали сравнивать. но вот тут как раз то и становится не ясно как это осуществить.
Операция поиска совпадения по шаблону в левой части - допустим true. Операция поиска совпадения по шаблону в правой части, параметр в форме не был введен - false. Условие же не выполнится. Или я недопонимаю что-то. Я не знаю как надо поступать. Прочитать строки и сравнить, если это можно реализовать, то как это сделать. |
||||||
|
|||||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
прочитать поля в хеш (для удобства), затем
map { $_ => exists $hash{$_} && param($_) eq $hash{$_} } param() получите хеш результатов сравнений существующих параметров (вместо eq можно взять регекс). далее обрабатываете как вам удобно (предполагается, что param() -- функция из CGI* модулей). А еще проще -- использовать какой-либо из валидаторов, типа Data::FormValidator |
|||
|
||||
tooncheg |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
У меня есть пару вопросов по поводу как занести данные в хэш . я изменил текстовую БД 1::Сидоров::Самуил::Виторганович::5533::113::Бухгалтерия 2::Петров::Лев::Игнатьевич::5322::114::Кадров 3::Иванов::Иван::Иванович::5322::119::56 потом читаю строки так
Но в результате хэш заполняется только последней строкой, т.е. в хэше содержится только последняя строка 3::Иванов::Иван::Иванович::5322::119::56 И вообще правильно ли я Вас понял, как надо прочитать поля в хэш? |
||||
|
|||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
|
|||
|
||||
tooncheg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
Я извиняюсь. Просто потратил кучу времени, а справочник создать не получается даже после совета arto.
Как реализовать сравнение введенного из формы и записанного в ХЭШ, и записанного в ХЭШ из текстового файла. Например, если в форме вводились данные номер телефона и фамилия с кем связан этот телефон, то выводились данные конкретного человека. Заранее спасибо. |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
map { ( $form{$_} || "" ) eq ( $file{$_} || "" ) } keys %form
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
tooncheg, напишите, как Вы представляете поиск, т.е. что вводится в поля и что должно быть выведено в качестве результата поиска (нужны примеры).
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
tooncheg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
Самая простая форма. 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 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
tooncheg, вот мой вариант без CGI и для текста в кодировке cp1251:
Это сообщение отредактировал(а) ginnie - 28.5.2013, 17:19 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
tooncheg |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
ginnie
Мне не очень понятны несколько строк
$person если его вывести на экран, то это будут ссылки на то где хранится в памяти хэш. Что в реальности происходит тут? Еще не понял для чего нужен еще {number}.
Что происходит тут? Прошу отнестись снисходительно, т.к. я только учусь. Заранее спасибо. |
||||
|
|||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
tooncheg, хэш позволяет нам получать определенные данные из набора по ключу. Это свойство мы используем для организации поиска. Для того, чтобы искать по номеру телефона, надо создать хэш, где ключем будет номер телефона, а значениями данные о людях. Т.к. один номер может быть у нескольких человек, значение в хэше будет массивом. Кроме номера телефона, поиск также может осуществляться по другим полям, поэтому будет несколько хэшей (равно количеству полей для поиска). Чтобы не дублировать в каждом хэше данные о людях, будем в значении хранить только идентификатор человека ($number) и добавим еще один хэш, где ключами будут идентификаторы, а значениями - данные о человеке ($directory{number}{$number} = $person;)
Все используемые хэши я оформил в едином хранилище, которое также представляет собой хэш %directory, в котором ключами являются названия полей.
Добавляем в данные для поля $key по ключу lc($value) идентификатор пользователя $number. lc используем для того, чтобы поиск был независимым от регистра. Если еще есть какие-нибудь вопросы, не стесняйтесь задавать! -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
tooncheg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
ginnie
поясните пожалуйста строку из кода $results{$number}++; В бест пректисе встречалась подобная структура, но не смог разобраться. |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: 2 Всего: 16 |
Инкремент элемента хэша %results с ключом $number
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
tooncheg, алгоритм поиска такой:
допустим задано три поля для поиска, выполняем отдельно по каждому заданному значению поиск в соответствующем кэше. Результатом выборки из кэша будут идентификаторы людей (в выборке они не повторяются). На каждом из трех этапов увеличиваем на единицу значение в хэше результатов для найденных идентификаторов. После трех этапов поиска выбираем из данных хэша результатов идентификаторы, у которых значение равно количеству этапов. Если алгоритм понятен, попробуйте дописать программу, выводя кроме полного совпадения, еще и результаты, которые были ближе всего к полному совпадению (т.е. совпали не все поля). ![]() Это сообщение отредактировал(а) ginnie - 5.6.2013, 13:43 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
tooncheg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
Это понятно Что происходит? Если Значение хеша undef , т.е. 0 идет приращение на 1цу ? Это сообщение отредактировал(а) tooncheg - 5.6.2013, 13:47 |
|||
|
||||
tooncheg |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 20.5.2013 Репутация: нет Всего: нет |
ginnie,
вроде работает. Появился вопрос. Каким образом происходит объединение в этой строке join('::', @{$directory{number}{$number}}{qw{surname name patronymic phone room otdel}}) не понимаю последовательность происходящего там. Это сообщение отредактировал(а) tooncheg - 10.6.2013, 13:59 |
||||
|
|||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Мне надо было вывести данные из справочника, сделал вывод полей через разделитель '::'. Т.к. данные хранятся в хэше, надо, чтобы значения вынимались в строго определенном порядке, используем вариант @hash{'field1', 'field2', 'field3'...'fieldN'}. Последовательность такая:
Это сообщение отредактировал(а) ginnie - 10.6.2013, 15:12 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |