Анимация
JavaScript


Главная  Библионтека 

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

аналогии с тем, как для ссылок на отдельный элемент массива используется префикс $). Следовательно, отношение «начальник Ната» должно записываться в виде $boss{"Nat"}.

В обычных массивах используются числовые индексы, но индексы хэшей всегда являются строковыми. Ассоциированные значения могут быть произвольными скалярными величинами, в том числе ссылками. Используя ссылки в качестве ассоциированных значени!!, можно создавать хэши для хранения не только строк и чисел, но и массивов, других хэшей или объектов (вернее, ссылок на массивы, хэши или объекты).

Хэши могут инициализироваться с помощью списков, содержащих пары «ключ/ зпачепие»:

%аде = ( Naf, 24, •Jules", 25, Josh", 17 );

Такая запись эквивалентна следующей:

SageCNat") = 24, $age{"Jules} = 25; $age{"Josh} = 17;

Для упрощения инициализации хэшей был создан оператор, оператор =>. В основном оп представляет собой более наглядную замену для запятой. Например, возможна следующая инициализация хэша:

%food color = (

Apple => Ted,

Banana" => "yelloW,

"Lemon => "yellow,

"Carrot" => orange

(хэш %food color используется во многих примерах этой главы). Такая инициализация также является примером списковой эквивалентности - в некоторых отношениях хэш ведет себя так, словно онявляется списком пар «ключ/значение». Мы воспользуемся этим в нескольких рецептах, в частности - для объединения и инвертирования.

В 0Tjni4He от обычной запятой, оператор => обладает особым свойством: любое предшествующее ему слово интерпретируется как строковое значение. Это позволяет убрать кавычки и сделать программу более понятной. Однословные ключи хэшей также автоматически интерпретируются как строки, поэтому вместо $hash{"somekey} можно написать просто $hash{somekey}. Приведенная выше инициализация %food color записывается в следующем виде:

%fQ0d CQl0r = (

Apple => red,

Banana => •yellow,

Lemon => yellow",

Carrot => orange" ),



5.1. Занесение элемента в хэш 153

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

> Смотри также-

Описание функций unshift и splice вperifunc(l).

5.1. Занесение элемента в хэш

Проблема

Требуется добавить в хэш новый элемент.

Решение

Присвойте нужное значение в записи вида: $ХЭШ{$КЛЮЧ} = $ЗНАЧЕНИЕ;

Комментарий

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

# Хэш %foocl color определяется во введении $foocl color{Raspberry} = "pink"; print "Known foods:\n"; foreach $food (keys %food color) { print "$food\n";

Known foods:

Banana

Apple

Raspberry

Carrot

Lemon

Если в качестве ключа хэша используется неопределенная величина undef, она преобразуется в пустую строку (что сопровождается предупреждением при запуске с параметром -w). Вероятно, пеопределеипый ключ undef - это не то, что вы хотели. С другой стороны, undef является вполне допустимым значением в хэшах. Однако при выборке значения для ключа, отсутствующего в хэше, вы также получите undef. Это означает, что для проверки существования ключа $кеу в хэше %hash простая логическая проверка if ($hash {$кеу}) не подходит. Присутствие ключа в хэше проверяется записью вида exists($hash{$key}); определенность ассоциированного значения - defined($hash{$key}), а его истинность - if ($hash{$key}).



Banana is a food Martini is a drink

Функция exists проверяет только наличие ключа в хэше Она не сообщает об ассоциированном значении, определено ли оно, истинно или ложно На первый взгляд кажется, что отличия несущественны Однако в действительности проблемы такого рода плодятся быстро, как кролики Возьмем следующий фрагмент

Toddler } = 3

Во внутренних алгоритмах хэширования Perl перестановки строки попадают на одну и ту же позицию Если в ключах хэша многократно встречаются перестановки одной строки (скажем, spare и craps ), быстродействие хэша заметно падает На практике это происходит редко

> Смотри также-

Раздел «List Value Constructors*peildata{\), рецепт 5 2

5.2. Проверка наличия ключа в хэше

Проблема

Требуется узнать, содержит ли хэш конкретный 1слюч независимо от ассоциированного с ним значения

Решение

Воспользуйтесь функцией exists

# Содержит ли %ХЭШ ключ $КЛЮЧ> If (ех1815($ХЭШ{$КЛЮЧ})) {

й Ключ существует } else {

# Ключ не существует

Комментарий

в следующем фрагменте функция exists проверяет, присутствует ли ключ в хэше %food color

й Хэш %food color определяется во введении foreach $name ( Banana Martini ) { if (exists $food color{$name}) {

print Sname is a food \n } else {

print Sname is a drink \n



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