Perl: интересные hash-конструкции

Как известно, Perl предоставляет мощный механизм связывания (tie) переменных, в том числе, хэшей. Это позволяет реализовать весьма интересные разновидности ассоциативных массивов

[OpenNet]

Как известно, Perl предоставляет мощный механизм связывания (tie) переменных, в том числе, хэшей. Связанный хэш отличается от обычного тем, что стандартные манипуляции с ним, такие как вставка/удаление элемента, поиск по ключу и т.п., на самом деле транслируются в вызовы некоторых методов. Это происходит незаметно для пользователя и широко используется на практике, в первую очередь, для работы с файловыми базами данных. Согласитесь, это весьма удобно: файл БД связывается с хэшем, после чего для изменения данных в базе необходимо произвести обычное присваивание.

Однако, область применения механизма связывания этим не ограничивается. На сайте CPAN можно найти множество модулей, использующих tie для реализации интересных разновидностей ассоциативных массивов. В этой статье мы кратко рассмотрим некоторые из них. Заинтересованный читатель может обратиться к соответствующим пакетам, и найти более развернутую документацию, а также примеры исходного кода.
  • Tie::Hash::Approx - хэш с "приблизительным" поиском. Если запрашиваемый элемент хэша не найден, то осуществляется попытка вернуть значение наиболее похожего ключа.
  • Tie::AliasHash - "хэш с псеводнимами". Оптимальный вариант, когда одно и тоже значение имеет множество ключей;
  • Tie::Hash::Expire - хэш с заданием времени жизни записи, облегчает организацию кэширования;
  • Bloom::Filter, Bloom16, Text::Bloom - используют вероятностную оценку и позволяют определить наличие ключа в хэше, представляющем собой множество очень большого размера (без реального сохранения всех записей), причем с минимальным потреблением ОЗУ;
  • Tie::Hash::Regex и Tie::RegexpHash - возможность указать регулярное выражение в качестве ключа;
  • Tie::SortHash - хэш, хранящий ключи в отсортированном виде (хороший знакомый программистов на PHP). Tie::Hash::Rank - обратный случай - элементы сохраняются отсортированными по данным, которые ассоциированы с ключом. Tie::InsertOrderHash и Tie::Hash::Indexed - сортировка в порядке вставки элементов;
  • Tie::RangeHash - в качестве ключа выступает числовой промежуток, например от 1 до 5 ="a", от 6 до 10 = "b". Если вам сложно представить, зачем это может быть нужно, подумайте о тарифах сотовых операторов или Интернет-провайдеров: от 1 до 50 Мб - N рублей, от 50 до 100 Мб - m рублей и т.п.;

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

[ опубликовано 23/09/2004 ]

OpenNet - Perl: интересные hash-конструкции   Версия для печати