Анимация
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


в этой главе:

• Что такое лет

• Хет-псре.менные

• Лтисрплыюе пред ста влсп и с лета

• Хеш-функции

• Срезы хешей

• Упражнения ХвШМ

Что такое хеш

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

Элементы хеша не стоят в каком-то конкретном порядке. Можете рассматривать их как стопку библиографических карточек. Верхняя половина каждой карточки - это ключ, а нижняя - значение. Каждый раз, когда вы помешаете в хеш значение, создается новая карточка Когда нужно изменить значение, вы указываете ключ, и 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