Анимация
JavaScript
|
Главная Библионтека 7-й час Хэши Хэш - третий основной тип данных г). Первый - это скаляры, предназначенные для хранения одиночных значений произвольного типа, и размер. Второй - массивы, представляющие собой коллекции скаляров. Массив может содержать любое количество элементов, но поиск в массиве определенного элемента зачастую связан с последовательным перебором всех элементов массива. Хэши - еше один вид коллективных данных. Как и массивы, хэши представляют собой коллекцию скаляров. Разница между ними состоит в том, что доступ к элементам хэша осуществляется по имени, а не с помощью числовых индексов, как в массивах. Элементы хэша состоят из двух частей - ключа и значения. Ключ идентифицирует элемент хэша, а значение содержит данные, связанные с этим ключом. Такая взаимосвязь описывается термином пара ключ-значение. Подобные структуры данных как нельзя лучше подходят для многих приложений. Например, для хранения информации о всех водительских лицензиях в некотором регионе удобно в качестве ключа использовать их номера, поскольку номер лицензии конкретного водителя уникален. С этими ключами можно связать данные о водителе: тип лицензии, адрес, возраст и т.д. Каждая водительская лицензия будет представлена отдельным элементом хэша с номером и необходимой информацией, заданной в виде пары ключ-значение. Вот еще примеры других хэш-подобпых структур данных: инвентарные книги, медицинские карточки, телефонные счета, дисковая файловая система, музыкальные коллекции на компакт-дисках, библиотечные каталоги и многое, многое другое. Хэши в Perl могут содержать произвольное количество элементов, во всяком случае, насколько это позволяют ресурсы системной памяти. Хэши изменяют свои размеры по мере того, как к ним добавляются новые элементы или удаляются старые. Доступ к индивидуальному элементу хэша происходит очень быстро и не сильно замедляется с ростом хэша. Это означает, что Perl комфортно чувствует себя и с хэшем из 10, и из 100 000 элементов. Ключи хэша могут быть произвольной длины, т.е. они являются обыкновенными скалярами. Данные также могут быть произвольной длины. Раньше хэши в Perl и в других языках программирования назывались ассоциативными массивами. Этот термин означал, что ключи элементов связаны с их значениями. Но поскольку программисты на Perl - люди немногословные, они придумали более короткий термин для обозначения ассоциативного массива - хэш. 110 Ча!. ОcноEl Perl Переменные-хэши обозначаются в Perl символом процент). Их имена не пересекаются с именами массивов и скаляров. Например, в программе может существовать хэш массив еа и скаляр $а.. Каадое из этих имен относится к самостоятельной неременной. Основные темы этого занятия. • Создание хэша. . • Вставка и удаление элементов хэша. • Использование хэша для обработки массивов. Наполнение хэша Индивидуальные элементы хэша создаются путем присвоения им значений, как и в случае массивов. Вот типичный пример: $Authorв{Dune}=Frank Herbert; В этом примере присваивается значение элементу хэша Ключ этого элемен- та - слово Dune, а данные - имя Frank Herbert. Этот онератор присваивания создает связь в хэше между словами Dure и Frank Herbert. С переменной SAuthors{Dune) можно, обращаться так же, как и с любым скаляром: ее значение можно передавать в функции, модифицировать с помощью операторов, распечатывать и переопределять. Не забывайте, что при изменении элемента хэша модифицируется значение этого элемента, а не сам хэш. Почему в нашем примере используется синтаксис ors{}, а ors{}? Дело в том, что специальный символ перед именами хэшей, как и в случае массивов, появляется только тогда, когда они рассматриваются как единое целое. Для доступа к индивидуальному элементу хэша используется символ доллара ($), свидетельствующий о том, что это скалярное значение, а фигурные скобки обозначают принадлежность к хэшу. В Perl конструкция $Authors{Dune) соответствует одному скалярному значению, в данном случае F Herbert. Хэш, содержащий только, один ключ, не представляет собой никакой ценности. Для помещения в хэш нескольких значений необходимо выполнить серию операторов присваивания, например: $food{apple}=fruit; $food{pear}=fmit; $food<carrot>=vegetable; Для того чтобы сократить эту операцию, для инициализации хэша можно использовать список. Список должен содержать пары ключей и значений, как показано ниже: %food=(apple, fruit, pear, fruit, carrot, vegetable); Этот пример напоминает инициализацию массивов, речь о которой шла на 4-м занятии, "Укладка строительных блоков: списки и массивы". Ниже вы узнаете, что во многих контекстах хэши ведут себя как массивы. При инициализации хэша большим списком бывает трудно определить, где ключ, a где значение. В Perl имеется специальный оператор запятая-стрелка =>. Учитывая тот факт, что символы пробела игнорируются в программах на Perl, инициализацик) хэша можно переписать следующим образом: %food=( "apple" => "fruit", "pear" => fruit, "carrot" => vegetable, Программисты на Perl, хорошо известные своей любовью ко всевозможным упрощениям, придумали еще два дополнительных способа инициализации хэша. Предполагается, что левая часть оператора => - простая строка, которую не нужно заключать в кавычки. К тому же ключ хэша, состоящий из одного слова в фигурнтх скобках, также можно не заключать в кавычки. Поэтому предыдущие инициализации можно упростить: $Boolcs(Dune}=Frank Herbert; %food=( apple => fruit, pear => fruit, carrot => vegetable ); Оператор запятая-стрелка называется так потому, что действует как запятая (разделяет элементы списка) и похож на стрелку. Получение данных из хэша ДЛЯ извлечения индивидуального элемента из хэша нужно набрать символ $, имя хэша и ключ элемента, например: %Movies= ( The Shining => Kubrick, Ten CormHndments DeMUle, GoonLes => Spielberg) ; print $Hovies{The Shining};. Этот фрагмент кода распечатывает элемент The Shining хэш wies. В результате будет выведено слово Kubrick. Иногда требуется выполнить проверку всех элементов хэша. Если все ключи хэша известны, можно получить доступ к любому элементу хэша. Но обычно неудобно выполнять общие операции с элементами хэша, явно указывая имена ключей, поскольку все они могут быть неизвестны или их может быть слишком много для перечисления. Для получения списка ключей хэша используется функция keys. Ключи хэша не упорядочены, поэтому функция keys также возвращает список ключей в неупорядоченном виде. Для вывода всех фильмовиз нашего хэша используется следующий код: foreach $film (key ies) { print "$film\n"; В этом примере переменной поочередно присваиваются значения всех эле- ментов списка, возвращаемого выражением keys Если кроме названий филь- мов нужно распечатать имена режиссеров, используйте следующий код: foreach Sfilm {keys %Hovies) { print "Фильм $film бьш снят режиссером SMovies{$film}.\n"; После выполнения этого кода будут выведены следующие строки: Фильм Te ndments снят режиссером DeMille. The Shining снят режнссером Kubrick. Goonies снят режиссером Spielberg. Так как переменная содержит значение ключа хэша, конструкция возвращает значение элемента хэша с этим ключом. Для демонстрации взаимосвязи ключа и значения элемента хэша полезно их распечатать вместе. Однако следует иметь в виду, 112 Часть I. ОcнGEl Perl 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 |