Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> попытка создать телефонный справочник, perl телефонный справочник 
:(
    Опции темы
ginnie
Дата 30.5.2013, 11:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



tooncheg, хэш позволяет нам получать определенные данные из набора по ключу. Это свойство мы используем для организации поиска. Для того, чтобы искать по номеру телефона, надо создать хэш, где ключем будет номер телефона, а значениями данные о людях. Т.к. один номер может быть у нескольких человек, значение в хэше будет массивом. Кроме номера телефона, поиск также может осуществляться по другим полям, поэтому будет несколько хэшей (равно количеству полей для поиска). Чтобы не дублировать в каждом хэше данные о людях, будем в значении хранить только идентификатор человека ($number) и добавим еще один хэш, где ключами будут идентификаторы, а значениями - данные о человеке ($directory{number}{$number} = $person;)
Все используемые хэши я оформил в едином хранилище, которое также представляет собой хэш %directory, в котором ключами являются названия полей.
Код

push(@{$directory{$key}{lc $value}}, $number);

Добавляем в данные для поля $key по ключу lc($value) идентификатор пользователя $number. lc используем для того, чтобы поиск был независимым от регистра.

Если еще есть какие-нибудь вопросы, не стесняйтесь задавать!


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tooncheg
Дата 5.6.2013, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.5.2013

Репутация: нет
Всего: нет



ginnie

поясните пожалуйста строку из кода

$results{$number}++;

В бест пректисе встречалась подобная структура, но не смог разобраться. 
PM MAIL   Вверх
krypt3r
Дата 5.6.2013, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Инкремент элемента хэша %results с ключом $number
PM MAIL   Вверх
ginnie
Дата 5.6.2013, 11:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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

Если алгоритм понятен, попробуйте дописать программу, выводя кроме полного совпадения, еще и результаты, которые были ближе всего к полному совпадению (т.е. совпали не все поля).  smile 

Это сообщение отредактировал(а) ginnie - 5.6.2013, 13:43


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tooncheg
Дата 5.6.2013, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.5.2013

Репутация: нет
Всего: нет



Цитата(krypt3r @ 5.6.2013,  11:08)
Инкремент элемента хэша %results с ключом $number

Это понятно Что происходит? Если Значение хеша undef , т.е. 0 идет приращение на 1цу ?

Это сообщение отредактировал(а) tooncheg - 5.6.2013, 13:47
PM MAIL   Вверх
tooncheg
Дата 10.6.2013, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.5.2013

Репутация: нет
Всего: нет



ginnie,

Цитата(ginnie @ 5.6.2013,  11:42)
tooncheg
Если алгоритм понятен, попробуйте дописать программу, выводя кроме полного совпадения, еще и результаты, которые были ближе всего к полному совпадению (т.е. совпали не все поля).  smile

Код

#!/usr/bin/perl
use strict;
use warnings;
use locale;
use POSIX qw(:locale_h);
setlocale(LC_ALL, "ru_RU.CP1251");
use Data::Dumper;



my %directory;
open my $fh, '<', 'phone.txt' or die "Error open phone.txt: $!\n";

while (<$fh>){
    chomp;
    my ($number,$surname,$name,$patronymic,$phone,$room, $otdel) = split /::/, $_;
    my $person =  {
        name => $name,
        surname => $surname,
        patronymic => $patronymic,
        phone => $phone,
        room => $room,
        otdel => $otdel,
    };
    $directory{number}{$number} = $person;
       while (my ($key, $value) = each %{$person}) {
        next if (!defined $value or $value eq '');
        push(@{$directory{$key}{lc $value}}, $number);
        }
}
my %query = (
   surname => 'Иванов',
   phone => '5322',
   name => 'Иван',
   room => '112',
#   otdel => '7',
);
my $round = 0;
my %results;
while (my ($key, $value) = each %query) {
    next if (!defined $value or $value eq '');
    $round++;
    my $numbers = $directory{$key}{lc $value} or next;
    for my $number (@{$numbers}) {
         $results{$number}++;
         }
       }
 while (my ($number, $counter) = each %results) {
    print join('::', @{$directory{number}{$number}}{qw{surname name patronymic phone room otdel}}) $/ if ($counter ==$round) ;
}
my @counter = values %results;
my $max = $counter[0];
foreach (@counter) {
    if ($_ > $max)  {
        $max = $_
    }

foreach my $number (keys %results) {
    if ($max != $round and $results{$number}==$max) {
        print "Возможно : " . join('::', @{$directory{number}{$number}}{qw{surname name patronymic phone room otdel}}). "\n";
    }
}


вроде работает.
Появился вопрос. Каким образом происходит объединение в этой строке join('::', @{$directory{number}{$number}}{qw{surname name patronymic phone room otdel}}) не понимаю последовательность происходящего там.

Это сообщение отредактировал(а) tooncheg - 10.6.2013, 13:59
PM MAIL   Вверх
ginnie
Дата 10.6.2013, 15:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Цитата(tooncheg @  10.6.2013,  13:58 Найти цитируемый пост)
Появился вопрос. Каким образом происходит объединение в этой строке join('::', @{$directory{number}{$number}}{qw{surname name patronymic phone room otdel}}) не понимаю последовательность происходящего там.

Мне надо было вывести данные из справочника, сделал вывод полей через разделитель '::'. Т.к. данные хранятся в хэше, надо, чтобы значения вынимались в строго определенном порядке, используем вариант @hash{'field1', 'field2', 'field3'...'fieldN'}.
Последовательность такая:
  • строка 'surname name patronymic phone room otdel'  преобразуется оператором qw{} в список строковых значений ('surname', 'name' и т.д),
  • из хэша данных о человеке $directory{number}{$number} выбирается список значений полей,
  • список значений объединяется в одну строку с использованием разделителя '::'.


Это сообщение отредактировал(а) ginnie - 10.6.2013, 15:12


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0686 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.