Анимация
JavaScript
|
Главная Библионтека 5.2. Проверка наличия ключа в хэше 155 $аде{ Unborn } = О $аде{ Phantasm } = undef foreach $thing ( Toddler Unborn Phantasm Relic } { print Sthing print Exists if exists $age{$thing} print Defined if defined $age{thing} print True If $age{$thing) print \n Toddler Exists Defined True Unborn Exists Defined Phantasm Exists Relic Элемент $age{ Toddler } проходит все три проверки - существования, определенности и истинности Он существует, потому что мы присвоили ключу Toddler значение в хэше Он определен, потому что значение не равно undef Наконец, он истинен, потому что присвоенная величина не является одним из ложных значений Perl Элемент $age{ Unborn } проходит только проверки существования и определенности Он существует, потому что ключу Unborn было присвоено значение в хэше, и определен, потому что это значение не равно undef Однако он не является истинным, потому что О интерпретируется в Perl как одна из ложных величин Элемент $аде{ Phantasm } проходит только проверку существования Он существует, потому что ключу Phantasm было присвоено значение в хэше Поскольку это значение представляет собой undef, проверка определенности не работает Так как undef также считается в Perl одним из ложных значений, проверка истинности тоже не работает Наконец, $ age { Relic } не проходит ни одну из проверок Значение для Relic не заносилось в хэш, поэтому проверка на существование завершается неудачей Из-за отсутствия ассоциированного значения попытка обратиться к $аде{ Relic } дает undef Как мы знаем из примера с Phantasm , undef не проходит проверки определенности и истинности Иногда undef полезно сохранить в хэше Это означает «такой ключ встречается, но с ним не связано никакого полезного значения» Например, рассмотрим программу, которая определяет размер файлов из переданного списка Следующий фрагмент пытается пропускать файлы, которые уже встречались в списке, однако это не касается файлов нулевой длины и встречавшихся ранее несуществующих файлов %name = () while (О) { chomp next If $name{$ } # НЕВЕРНО i $name{$ } = -s $ 5.3. Удаление из хэша Проблема Требуется удалить элемент из хэша, чтобы он не опознавался функцией keys, values или each. Например, если в хэше имена работников ассоциируются с окладами, после увольнетшя работника необходимо удалить его строку из хэша. Решение Воспользуйтесь функцией delete: # Удалить $КЛЮЧ и ассоциированное значение из хэша %ХЭШ delete($XЭШ{$KЛЮЧ}), Комментарий Многие ошибочно пытаются удалять элементы из хэша с помощью undef - undef ${ХЭ111{$КЛЮЧ} или $ХЭ111{$КЛЮЧ} = undef. В обоих случаях в хэше будет присутствовать элемент с ключом $КЛЮЧ и значингем undef. Функция delete - единственное средство для удаления конкретных элементов из хэша. Удаленный элемент не появится пи в списке keys, ни в итерациях each; функция exists возвращает для него ложное значение. Следующий фрагмент демонстрирует отличия undef от delete: # Хэш %food color определяется во введении sub print foods { my ©foods = keys %food color, my $food, print Keys ©foodsXn , print Values foreach $food (©foods) { my Scolor = $food color{$food}, if (defined Scolor) { print Scolor , Замена неправильной строки следующим вызовом exists позволяет пропускать нулевые и иесуществуюипге файлы: next if exists $name{$ }, В самом первом примере предполагается, что все, что не является едой (food), относится к напиткам {dunk). В реальном мире гюдобные допущения весьма опасны 1> Смотри также- Описание функций exists и defined в perlfunc(i). Концепция истинности рассматривается в разделе «Scalar Values»perldala{\). 5.4. Перебор хэша Проблема Требуется выполнить некоторые действия с каждым элементом (то есть парой «ключ/значение») хэша. } else { print (undef) , print \n , print Initially \n , print foods() print \nWith Banana undef\n undef $food color{ Banana }, print foods(), print \nWith Banana deleted\n , delete $food color{ Banana }, print foods(), Initially Keys: Banana Apple Carrot Lemon Values: yellow red orange yellow With Banana undef Keys: Banana Apple Carrot Lemon Values: (undef) red orange yellow With Banana deleted Keys Apple Carrot Lemon Values: red orange yellow Как видите, после присвоения $food color{ Banana } = undef ключ Banana остается в хэше. Элемент не удаляется; просто мы присвоили ему undef. С другой стороны, функция delete действительно удалила данные из хэша - ключ Banana исчезает из списка, возвращаемого функцией keys. Фу1п<ция delete также может вызываться для среза хэша, это приводит к удалению всех указанных ключей. delete @food Golor{ Banana Apple Cabbage }, I> Смотри также- Описание функций delete и keys вperlfunc(i). Применение keys продемонстрировано в рецепте 5.4. 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 |