Анимация
JavaScript
|
Главная Библионтека в этой главе: • Что такое лет • Хет-псре.менные • Лтисрплыюе пред ста влсп и с лета • Хеш-функции • Срезы хешей • Упражнения ХвШМ Что такое хеш Хеш* похож на массив, который мы рассматривали выше, тем, что представляет собой набор скалярных данных, отдельные элементы которого выбираются по индексному значению. В отличие от массива, индексные значения хеша - не малые неотрицательные целые, а произвольные скаляры. Эти скаляры (называемые ключами) используются для выборки значении из массива. Элементы хеша не стоят в каком-то конкретном порядке. Можете рассматривать их как стопку библиографических карточек. Верхняя половина каждой карточки - это ключ, а нижняя - значение. Каждый раз, когда вы помешаете в хеш значение, создается новая карточка Когда нужно изменить значение, вы указываете ключ, и Perl находит необходимую карточку. Поэтому порядок карточек, по сути дела, роли не играет. Perl хранит все карточки (т.е. пары ключ-значение) в особом внутреннем порядке, который облегчает поиск конкретной карточки, поэтому при поиске не приходится просматривать все пары. Порядок хранения карточек изменять нельзя, так rгo даже и не пытайтесь**. Хеш-переменные Имя хеш-переменной состоит из знака процента (%) и буквы, за которой могут идти другие буквы, цифры и знаки подчеркивания числом от нуля и больше Другими словами, часть имени после знака процента похожа на в старой документации хеши назывались ассоциативными массивами, но мы настолько устали применять к столь распространенному понятию такой многосложный термин, что решили заменить его гораздо более удачным односложным словом Модули типа IxHash и DBfile обеспечивают некоторую степень упорядочения, но ценой существенного снижения производительности соответствующую часть имен скалярных переменных и массивов. Кроме того, точно так же, как нет никакой связи между $f red и @f red, хещ-пере-менная %fred не имеет ничего общего с названными объектами. Чаще всего хещ создается и используется путем обращения к его элементам, а не ко всему хешу. Каждый элемент хеша - отдельная скалярная переменная, доступная через индекс, представляющий собой строковое значение и называемый ключом. Так, обращение к элементам хеша %fred производится путем указания $f red{ $ключ}, где $ключ - любое скалярное выражение. Вновь подчеркнем, что обращение к элементу хеша требует иного синтаксиса, нежели обращение ко всему хешу целиком. Как и в случае с массивами, новые элементы хеша создаются путем присваивания значения; $fred{"aaa"} = "bbb"; )f создает ключ "ааа", значение "bbb" $fred{234.5} = 456.7; # создает ключ "234.5", значение 456.7 С помощью этих операторов в хеше создаются два элемента. При последующем обращении к элементам (по указанным ключам) возвращаются ранее записанные значения: print $fred{"ааа" }; # выводит на экран "bbb" $f red) 234. 5) += 3; # делает значение равным 459. При обращении к несуществующему элементу возвращается значение undef (как и при обращении к отсутствующему элементу массива или к неопределенной скалярной переменной). Литеральное представление хеша у вас может возникнуть необходимость обратиться к хешу целиком - например, чтобы инициализировать его или скопировать в другой хеш. Фактически в Perl никакого литерального формата для хеша не предусмотрено, поэтому он просто представляется в виде списка. Каждая пара элементов этого списка (в котором всегда должно быть четное число элементов) задает ключ и соответствующее значение. Это развернутое представление может быть присвоено другому хешу, который затем воссоздаст тот же самый хеш. Другими словами; @fred list = %fred; # @fred list получает значение # ("ааа","bbb","234.5","456.7") «Ьагпеу = @fred list; # создать %barney как %fred "barney = %fred; # ускоренный метод выполнения этой задачи osmootli = ("ааа","bbb","234.5","456.7"); # создать %smootli как %fred из литеральных значений Порядок пар ключ-значение в этом развернутом формате произвольный и контролю не поддается. Даже если вы меняете местами какие-то значения или создаете хеш целиком, возвращаемый развернутый список все равно будет стоять в том порядке, который Perl выбрал для обеспечения эффективного доступа к отдельным элементам. Ни на какую конкретную последовательность рассчитывать нельзя. Одно из применений такого свертывания-развертывания - копирование хеш-значения в другую хеш-переменную: -осору = %original; # копировать из %original в %сору Используя операцию reverse, можно создать хеш, в котором ключи и значения поменяются местами: %backwards = reverse %normal; Конечно, если %normal имеет два идентичных значения, то в %Ьаск-wards они превратятся в один элемент, поэтому данную операцию л1ше всего выполнять только над хешами с уникальными ключами и значениями. Хеш-функции в этом разделе перечислены некоторые функции, предназначенные для обработки хешей. Функция keys Функция keys ( %имя хеша) выдает список всех текущих ключей, имеющихся в хеше %имя хеша. Другими словами, применение этой функции эквивалентно возвращению всех элементов списка с нечетными номерами (первый, третий, пятый и т.д.) путем развертывания хеша %имя хеша в списочном контексте, причем функция keys возвращает их именно в этом порядке. Если элементы в хеше отсутствуют, функция keys возвращает пустой список. Применим эту функцию к хешу из предыдущих примеров: $fred{"aaa"} = "bbb"; $fred(234.5} = 456.7; @list = keys{%fred); # @list получает значение ( "aaa", 234.5) # или (234.5, "aaa") Как и во всех остальных встроенных функциях, круглые скобки не обязательны: функция keys %fred полностью идентична keys ( %fred) . foreach $кеу (keys (%fred)) { # однократно для каждого значения хеша °.fred print "at $кеу we have $fred{$key}\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 |