Анимация
JavaScript
|
Главная Библионтека 4.3. Изменение размера массива 119 The list is: recycle tired, old phrases; ponder big, happy thoughts; and sleep and dream peacefully. Как видите, мы отвергаем порочную практику исключения последней запято11 из списка, что нередко приводит к появлению двусмысленностей. > Смотри также- Описание функции grep вperlfunc{l); описание тернарного оператора выбора вpeiiop(l). Синтаксис вложенных списков рассматривается в рецепте 11.1. 4.3. Изменение размера массива Проблема Требуется увеличить или уменьшить размер массива. Допустим, у вас имеется массив работников, отсортированный по размерам оклада, и вы хотите ограничить его пятью самыми высокооплачиваемыми работникам п. Другой при.мер - если окончательный раз.мер массива точно известен, намного эффективнее выделить всю память сразу вместо того, чтобы увеличивать массив постеиеп]ю, добавляя элементы в конец. Решение Присвойте значение $#ARRAY: и Увеличить или уменьшить ©ARRAY $#ARRAY = $NEW LAST ELEMENT INDEX NUMBER Присваивание элементу, находящемуся за koihiom массива, автоматически увеличивает массив: $ARRAY[$NEW LAST ELEMENT INDEX NUMBER] = $VALUE; Комментарий $#ARRAY - последний допустимый индекс массива ©ARRAY. Ecjhi ему присваивается значение меньше текущего, массив у.меиьшается. Отсечешияе элементы безвозвратно теряются. Если присвоенное значение больше TCKyuiero, массив увеличивается. Новые элементы получают иеонределеиное значение. Однако $#ARRAY не следует путать с ©ARRAY. $#ARRAY представляет собой последний допусти.мый индекс массива, а ©ARRAY (в скалярном контексте, то есть в числовой интерпретации) - количество элементов. $#ARRAY на единицу меньше ©ARRAY, поскольку нумерация индексов начинается с 0. В следующем фрагменте использованы оба варианта: sub what about that array { print The array now has ", scalar(@people), elements.\n", print "The index of the last element is $((people \n"; print "Element #3 is $people[3].\n, (Эреор1е = qw(Crosby Stills Nash Young), what about that array(), Результат: The array now has 4 elements. The index of the last element is 3. Element «3 is Young. A другой фрагмент: $#people--, what about that array(); выводит следующий результат: The array now has 3 elements. The index of the last element is 2. Element #3 is . Элемент с индексом 3 нронал при уменьшении массива. Еслн бы програлг-ма запускалась с ключом -w, Perl также выдал бы предупреждепне об использовании неинициализировапноп величины, поскольку значепне $реор1е[3] не определено. В следующем примере: $«реор1е = 10 000, what about tliat array(), результат выглядит так: The array now has 10001 elements. The index of the last element is 10000. Element «3 is . Элемент Young" безвозвратно утерян. Вместо нрнсванванпя Sdpeople можно было сказать: $people[10 000]=undef, Массивы Perl не являются разреженными. Другими словами, еслн у вас имеется 10000-й элемент, то должны присутствовать и остальные 9999 элементов. Они могут быть неоиределсппымп, но все равно будут занимать память. Из-за этого $array[time] пли любая другая конструкция, где в качестве индекса используется очень большое целое число, является неудачным решением. Лучше восноль-3yiiTecb хэшем. При вызове print нам нриииюсь наппсать scalar ©array, поскольку Perl интерпретирует большинство аргументов в списковом контексте, а требовалось значение (За г ray в скалярном контексте. > Смотри также-;- Оннсанне $#ARRAY ърегЫа1а{\). complain($user), й , предупредить о нарушении 4.4. Выполнение операции с каждым элементом списка Проблема Требуется повторить некоторую операцию для каждого элемента списка. Массивы часто исполызуются для сбора 1И1тересующей информации - например, имен пользователей, превысивших свои дисковые квоты. Данные обрабатываются, при этом с каждым элементом массива выполняется некоторая операция. Скалсе.м, в примере с дисковыми квота.мп каждому пользовате;по отправляется предупреждающее сообщение. Решение Воспользуйтесь цнк.юм foreach: foreach $item (LIST) { й Выполнить некоторые действия с $item Комментарий Предположим, в массиве ©badusers собран список пользователей, превысивших свои дисковые квоты. В следующем фрагменте для каждого нарушителя вызывается процедура complain(): foreach $user (@bad users) { cofflplain($user), Столь трпвпа.11ьные случаи встречаются редко. Как npaanJUJ, для гепсращш списка часто используются (1)ункцпи foreach $var (sort keys %ENV) { print $var=$ENV{$var}\n , Функции sort и keys строят отсортированный список имен персмсппых окружения. Конечно, многократно используемые списки следует сохранять в массивах. Но для одноразовых задач удобнее работать со cihickom напрямую. Возможности этой конструкции расширяются пе только за счет построения списка в foreach, по и за счет дополнительных операций в блоке кода, Одно пз рас-простраиенн1)1Х прпмеиепий foreach - сбор информации о каждом .элементе списка и принятие некоторого решения на основании получеиных данных. Вернемся к примеру с квотами: foreach $user (iaall users) { $ctisk space = get usage($user); tt Определить объем используемого # дискового пространства if ($ctisk space > $MAX QU0TA) { й Если он больше допустимого , 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 |