| Содержание | Предисловие | В |
Глава 5В этой главе: ХешиЧто такое хеш Хеш* похож на массив, который мы рассматривали выше, тем, что представляет собой набор скалярных данных, отдельные элементы которого выбираются по индексному значению. В отличие от масс Элементы хеша не стоят в каком-то конкретном порядке. Можете рассматривать их как стопку библиографических карточек. Верхняя половина каждой карточки — это ключ, а нижняяХеш-переменные Имя хеш-переменной состоит из знака процента (%) и буквы, за которой могут идти другие буквы, цифры и знаки подчеркивания* В старой документации хеши назывались ассоциативными массивами, но мы настолько устали применять к столь распространенному понятию такой многосложный термин, что решили** Модули типа IxHash и DB_fiIe обеспечивают некоторую степень упорядочения, но ценсоответствующую часть имен скалярных переменных и массивов. Кроме того, точно так же, как нет никакой связи между $fred иКак и в случае с массивами, новые элементы хеша создаются путем присваивания значения: $fred {"ааа"} == "bbb"; # создает ключ "ааа", значение "bbb" $fred(234.5} = 456.7;С помощью этих операторов в хеше создаются два элемента. При последующем обращении к элементам (по указанным ключам) возвращаются ранее записанные значения: print $fred( "ааа"); # выводит на экран "bbb" $fred{234.5) += 3;При обращении к несуществующему элементу возвращается значение undef (как и при обращении к отсутствующему элементу массива или кЛитеральное представление хеша У вас может возникнуть необходимость обратиться к хешу целиком — например, чтобы инициализировать его или скопировать в др@fred_list = %fred; # @fred_list получает значение# ("ааа", "bbb","234.5","456.7") %barney = @fred_list; # создать %barney как %fred %barney = %fred;# создать %smooth как %fred из литеральных значенийПорядок пар ключ-значение в этом развернутом формате произвольный и контролю не поддается. Даже если вы меняете местами какие-то значения или создаете хеш целиком, возвращаемый развернутый спис Одно из применений такого свертывания-развертывания — копирование хеш-значения в другую хеш-переменную:%сору = %original; # копировать из %original в %соруИспользуя операцию reverse, можно создать хеш, в котором ключи и значения поменяются местами:%backwards = reverse %normal; Конечно, если %normal имеет два идентичных значения, то в %backwardsХеш-функции В этом разделе перечислены некоторые функции, предназначенные для обработки хешей. Функция keysФункция keys( %имя_хеша) выдает список всех текущихПрименим эту функцию к хешу из предыдущих примеров: $fred("aaa"} = "bbb"; $fred{234.5) = 456.7; Olist = keys(%fred); # @list получает значение ("ааа",234.5) # или (234.5,Как и во всех остальных встроенных функциях, круглые скобки не обязательны: функция keys %fred полностью идентичнаforeach $key (keys (%fred)) ( # однократно для каждого значения хеша %fredprint "at $key we have $fred($key}\n"; # показать ключ и значение }В этом примере показано также, что отдельные элементы хеша могут интерполироваться в строки в двойных кавычках. Весь хеш, однако, интерполировать таким образом нельзя*. В скалярном контексте функция keys выдает число элементов (пар ключ-значение), содержащихся в хеше. Например, вы можете выяснить, пуст ли хеш, так:if (keys(%xeni)) { # если keys() не равно 0:...; # массив не пустой )# ... или ...while (keys(%xem) < 10) { . . .; # продолжать цикл, пока меньше 10 элементов }Для того чтобы узнать, пуст хеш или нет, нужно просто использовать функцию %хеш в скалярном контексте: if (%хеш) ( # если "истина", в нем что-то есть# что-то сделать )Функция valuesФункция values (%имя_массива) возвращает список всех текущих значений указанного массива в том же порядке, в каком функция%lastname =0; # сделать %lastname пустым $lastname("fred"} = "flintstone";$lastname("barney"} = "rubble"; Olastnames = values(tiastname); # получить значенияМассив @lastnames будет содержать либо значения ("flintstone", "rubble"),Функция eachДля выполнения цикла над всем хешем (т.е. для проверки каждого его элемента) можно использовать функцию keys и получать зн* Можно, в принципе, с помощью среза, но здесь о срезах мы не говорим.Например, чтобы пройти по хешу %lastname из предыдущего примера, нужно использовать нечто такое:while ( ($first,$last) = each(%lastname)) { print "The last name of $first is $last\n"; } Присваивание нового значения всему хешу заставляет функцию each перейти в его начало. Добавление элементов в хеш и удаление изФункция deleteИтак, вы можете добавлять элементы в хеш, но пока не можете удалять их (кроме как путем присваивания нового значения всему хешу). Для удаления элементов хеша в Perl<%fred = ("aaa","bbb",234.5,34.56); # добавить в %fred два элемента delete $fred("aaa"}; #Срезы хешей Как и в случае с переменной-массивом (или списочным литералом), можно воспользоваться срезом хеша, что даст возможность обращаться не к одному его элементу, а одновременно к набору элем $score("fred"} - 205; $score("barney"} = 195; $scoref"dino"} = 30; Все это можно записать одной строкой: ($score("fred"},$score("barney"),$score("dino")) ° (205,195,30); Но даже она слишком длинна, поэтому давайте используем срез хеша: $score{"fred","barney","dino"} = (205,195,30); Вот так гораздо короче. Можно сочетать использование среза хеша и интерполяции переменных: @players = qwffred barney dino); print "scores are: @score(@players}\n"; Срезы хешей можно также использовать для слияния небольшого хеша с более крупным. В этом примере меньший хеш имеет приоритет в том смысле, что при наличии ключей-дубликатов используется значени @league{keys %score( = values %score; Здесь значения хеша %score сливаются с хешем %league. Это эквивален%league = (%league, %score); = # слить %score с %leagueУпражнения Ответы к упражнениям даны в приложении А. 1. Напишите программу, которая читает строку, а затем выводит эту строку и соответствующее ей значение согласно приведенной ниже таблице:
2. |
| Содержание | Предисловие | В |