Главная | Разделы | Поиск | Группы | Чат | Видео | Фото | Блоги | Помощь



Здравствуйте, гость. Пожалуйста войдите или Зарегистрируйтесь (забыл пароль)
Логин:
Пароль:





Пользователей: 29
Новичок:
Althea
Сейчас на сайте: 2
Сообщений: 21
Тем: 41
Разделов: 50
Статистика
О проекте

Новое в блогах:
" satan666 98 "
" satan666 97 "
" satan666 96 "
" satan666 95 "
" satan666 94 "
" satan666 93 "
" satan666 92 "
" satan666 91 "
" satan666 90 "
" satan666 89 "
Остальные
Новый контент:
"satan666 129"
"satan666 128"
"satan666 125"
"satan666 124"
"satan666 123"
"satan666 122"
"satan666 121"
"satan666 120"
"satan666 119"
"satan666 118"
Остальные
Новые разделы:
"satan666 251" by ProFTP
"satan666 250" by ProFTP
"satan666 249" by ProFTP
"satan666 248" by ProFTP
"satan666 247" by ProFTP
"satan666 246" by ProFTP
"satan666 245" by ProFTP
"satan666 244" by ProFTP
"satan666 243" by ProFTP
"satan666 235" by ProFTP
Остальные



Новые фотографии:
Рейтинг фотографий

Новые видео клипы:
Рейтинг видео клипов



Навигационная панель

В чате сейчас: 0 человек >>

Сообщений без ответа: 0 >>

Дополнительные функции доступные только зарегистрированным пользователям!


Новости и важные обсуждения

Идея групп (клубов, социальных сетей) >>

Чат (функциональность, технологии) >>

Новости проекта, разработки

Знакомства (движок, компонент, пример) >>

Панель





Просмотр темы

Главная --> Компьютеры --> Интернет --> Программирование --> PERL -->
       Следующий контент »
На уровень выше Посмотреть подразделы


Тема: Cравнение сложных структур данных в Perl        (Просмотров: 4530)
Автор: ProFTP
Дата: 1261210825
Новое: 1294147668
Посмотреть комментарии этой темы


Cравнение сложных структур данных в Perl

Задача стояла следующая, необходимо написать универсальную блоговую модель, на основе которой можно хранить любые данные любой сложности. Особенность таких данных в том, что есть корневые элементы данных, от которых отраставют любые структуры. Впринципе придумать что-то другое сложно, да и к тому же меня эта модель вполне устраивает. Сам алгоритм работы уже был построен так что в модуле (написанном на Perl) существовало 2 функции получить данные, и записать данные. Вот тут я и задумался, что этими функциями я не отделаюсь, во первых нужна возможность удаления, изменения записей и наконец основой основ должен быть ПОИСК. Когда я писал ret WebOS data.pm (http://jkeks.far.ru/ret) я подошел к этому грубо говоря НИКАК. Во первых записи читались только по одной Когневые элементы предсталяли из себя простые хэши с некоторыми зависимости, чем-то напоминающими XML. Это оказалось очень неудобно. Новый код по запросу может возвращать массив данных, грубо гвооря сложный массив. Что я подразумеваю под словом сложный. Если вы сталкивались с Perl , то наверняка знаете внутренее устройство сложных структур. Мягко говоря - она до ужаса мне нравится. Все построено на ссылках. Двухмерный массив мы получим когда каждому элементу массива мы ассоциируем ссылку на отедльный массив. Таким образом мы легко можем создавать Х-мерные массивы. кроме того какие-то элементы могу ссылаться на простые строки (скаляры) данных, а некоторые на хэши. В популярной книге Кристиансена Perl CookBook описаны лишь базовые возможности ссылок. Например Хэши массивов или массивы хэшей. Нас же интересуют ЛЮБЫЕ. А точнее массив чего-то! например Массив хэшей массивов скаляров. Стрктуру определяет программист. Интерфейс для работы с данными предоставляет сам Perl (немного сложный, однако вполне претенддующий на роль УНИВЕРСАЛЬНОГО) Итак.. ПОИСК. О условиях. Имеется грубо говоря 2 массива А и Б. А - это пользовательский шаблон по которому мы ищем данные. Б - это одна из записей из базы данных. Обе они представляют из себя сложные массивы. Массивы будут совпадать, при условии что все элементы массива А будут в точности совпадать с соответствующими элементами массива Б. т.е. у нас не полное сравнение, а лишь до первого несовпадения. На базе этого можно будет строить поиск с использованием реулярных выражений, и с использованием логических опреаций. Но мы будем мучаться над самым простым. Я 3 дня не мог приехать к решению, а может и больше уже наверно.. пока не пошел в бблиотеку и не посидел там рядом с девченками 8) И вот что получилось: Алгоритм представляет из себя 4 блока, 3 из них почти одинаковые и работают с разными типами данных SCALAR HASH ARRAY. четвертый выполняет повторяющиеся функции. Рассмотрим самый простой блок обработки скаляров: Блок этот выполнен в виде функции _Scalar В его задачи входит проверка на соответствие однородность типов скаляров. Далье Если скаляр является ссылкой , тогда в массив накопления ссылок из соответствующих элементов массивов кладутся значения. Иначе проверяются сами данные на совпадение. Последний абзац вы наверняка не поняли. Поэтосму расскажу лучше в общих чертах. Перебор сложного массива превращается в перебор кучи простых массивов. Для каждой следующей структуры (массива, хэша или скаляра) создается 2 записи в массиве ссылок. (первая запись - это ссылка в шаблонном массиве, а вторая - это ссылка в массиве базы данных) Каждая простая структура проверяется полностью. Только после завершения проверки структуры программа смотрит в массив ссылок. Есть ли там данные. Если они там есть, то достаются ссылки, разыменовываются и наконец мы получаем следующую простую структуру. В которой так же могут быть ссылки, которые так же попадут в тот же самый массив ссылок, если не произойдет несовпадения данных. Это очень нересурсоемкий алгоритм, потому что каждая ссылка на новую простую структуру делает копию только простой структуры. Ну и теперь хочу привести простой пример отходя от которого можно развить идею, В начале определимся, что в массиве a@ находится оригинальный массив с шаблоном от пользователя. @b очередная запись считанная из базы @a_ - рабочий простой массив, получаемый после опреации: @a_=@a; (понятно что копируется в него не все, а только начальный массив, без данных от ссылок. @b_ - аналогично! Code: sub _Array { for ($i=0;$i<#$;$i++) { if (ref($b[i]) ne ref($a_[i])) {} # не совпадает структура if (ref($a_[i]) {push (@link, $a_[i]); push (@link, $b_[i])} else { if ($a_[i] ne $b_[i]) # не совпадают элементы массива {} } } _All(); } sub _All { if ( #$link > 0 ) { $b = pop @link; $a = pop @link; if (ref($a) ne ref($b) {} # не совпадает структура опять. Одно из правил о # несовпадении структуры лишее. if (ref($a) eq 'SCALAR') {$a_=$$a; $b_=$$b; _Scalar()} if (ref($a) eq 'ARRAY') {@a_=$@a; @b_=$@b; _Array()} if (ref($a) eq 'HASH') {%a_=$%a; %b_=$%b; _Hash()} } else {} # данные совпали!!! } Ну вот.. а по принципу функции _Array() надо написать функцию _Hash и _Scalar. Вот и вся сложность сравнения стрктур данных любой сложности. А на этом я все.. Чтоб у вас не было таких проблемм. Ну и сами вы сможете оценить полноценный код (который однозначно скоро появится на http://jkeks.far.ru/ret , ну и хуже того на базе этого будет работать проект http://revda.biz Так что заходите в гости. http://www.opennet.ru/base/dev/perl_datatype.txt.html





Проголосовавшых: 2        Балов: 10        Среднее: 5        Популярность: 3       
Чтобы проголосовать вы должны зарегистрироватся !




Группы:       
Групп не найдено!





Фотоальбомы:       

ProFTP
тест-тест

ProFTP
sdfdsfdfs
>>> посмотреть остальные фотоальбомы





Видеоальбомы:       
Видеоальбомов не найдено



Комментарии



Гостям, запрещено создавать комментарии! Можете зарегистрироватся ...



HTML/CSS/JS has been tested in a browser Firefox2-3, secondary - IE.
BETA testing, Lite version. MVC Catalyst, Perl, jQuery UI/Plugins, CSS3, MySQL, FreeBSD, etc. Open source (email: q7u5@ukr.net)
1 1 1 1 333 2 3 4 5
http://www.free-lance.ru/users/q7u5
http://www.free-lance.ru/users/q7u5/info/
http://www.developers.org.ua/m/ProFTP/
http://kosenkod.moikrug.ru/
http://www.superjob.ua/resume/?id=5211132
http://forum.searchengines.ru/showthread.php?p=5323525
http://job.ukr.net/resume/dmitrij-267783/
http://forum.perl.dp.ua/cgi-bin/YaBB.pl?num=1250013012
http://it4business.ru/forum/topic15656.html
http://www.weblancer.net/users/ProFTP/
http://forum.sources.ru/index.php?showtopic=322336
http://job.tochka.net/resume-359091/
http://hh.ua/resume/269c232aff00e06e2f0039ed1f4b576d35595a
http://www.cyberforum.ru/job-search/thread355972.html
666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666 666