Анимация
JavaScript
|
Главная Библионтека После преобразования в строку ссылка принимает следующий вид: Class::Somewhere=HASH(0x72048) ARRAY(0x72048) Преобразованную ссылку невозможно вернуть к прежнему виду, поскольку она перестала быть ссылкой и превратилась в обычную строку. Следовательно, при использовании ссылок в качестве ключей хэша они теряют свои «волшебные свойства». Для решения этой проблемы обычно создается специальный хэш, ключами которого являются ссылки, преобразованные в строки, а значениями - настс5я-щие ссылки. Именно это и происходит в модуле Tie::RefHash. Мы воспользуемся объектами ввода/вывода для работы с файловыми манипуляторами и покажем, что даже такие странные ссылки могут использоваться для индексации хэша, связанного с Tie::Refflash. Приведем пример: use Tie RefHash, use 10 File, tie %name. Tie RefHash , foreach Sfilename ( /etc/termcap , /vmunix , /bin/cat ) { $fh = 10 File->( < Sfilename ) or next, $name{$fh} = $filename, print open files , ]oin( , values %name \n , foreach $file (keys %name) { seek($file, 0, 2), # Позиционирование в конец файла printf( %s is %d bytes long \n $name{$flie}, tell($file)) Однако вместо применения объекта в качестве ключа хэша обычно достаточно сохранить уникальный атрибут объекта (например, имя или идентификатор). 1> Смотри также- Документация по стандартному модулю Tie::Refflash; раздел «Warning» perl-ref{\). 5.13. Предварительное выделение памяти для хэша Проблема Требуется заранее выделить память под хэш, чтобы ускорить работу программы - в этом случае Perl не придется выделять новые блоки при каждом добавлении элемента. Окончательный размер хэша часто бывает известен в начале построения, и эта информация пригодится для повышения быстродействия. 5.14. Поиск самых распространенных значений 171 Решение Присвойте количество пар «ключ/значение>> конструкции кеу5(%ХЭШ): # Выделить в хэше %hash память для $num элементов keys(%hash) = $num, Комментарий Новая возможность, впервые появившаяся в Perl версии 5.004, может положительно повлиять на быстродействие вашей программы (хотя и не обязательно). В хэшах Perl и так применяются общие ключи, поэтому при наличии хэша с ключом Apple Perl уже не выделяет память под другую копию Apple при включении этого ключа в другой хэш. # В %users резервируется место для 512 элементов keys(%users) = 512, Внутренние структуры данных Perl требуют, чтобы количество ключей было равно степени 2. Если написать: keys(%users) = 1000, Perl выделит для хэша 1024 «гнезда». Количество ключей не всегда равно количеству гнезд. Совпадение обеспечивает оптимальное быстродействие, однако конкретное соответствие между ключами и гнездами зависит от ключей и внутреннего алгоритма хэширования Perl. > Смотри также- Функция keys описана вperlfunc(i). Также обращайтесь к рецепту 4.3. 5.14. Поиск самых распространенных значений Проблема Имеется сложная структура данных (например, массив или хэш). Требуется узнать, как часто в ней встречается каждый элемент массива (или ключ хэша). Допустим, в массиве содержатся сведения о транзакциях Web-сервера и вы хотите узнать, какой файл запрашивается чаще остальных. Или для хэша, в котором имя пользователя ассоциируется с количеством регистрации в системе, требуется определить наиболее распространенное количество регистрации. Решение Воспользуйтесь хэшем и подсчитайте, сколько раз встречается тот или иной элемент, ключ или значение: %count = о, foreach $element (@array) {
Например, мы можем легко построить генеалогическое дерево любого персонажа: while (о) { chomp, do { $count{$element}++ Комментарий Каждый раз, когда возникает задача подсчета различных объектов, вероятно, стоит воспользоваться хэшем. В приведенном выше цикле foreach для каждого экземпляра $element значение $count{$eleiiient} увеличивается на 1. 1> Смотри также- Рецепты 4.6 и 4.7. 5.15. Представление отношений между данными Проблема требуется представить отношения между данными - например, отношения «предок/потомок» в генеалогическом дереве или «родительский/порожденный процесс» в таблице процессов. Задача тесно связана с представлением таблиц в реляционных базах данных (отношения между записями) и графов в компьютерных технологиях (отношения между узлами графа). Решение Воспользуйтесь хэшем. Комментарий Следующий хэш представляет часть генеалогического дерева из Библии: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 [ 51 ] 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |