ПредишенСледващото

* Hash спектър подобен на този, разгледаните по-горе, че е набор от скаларни данни, чиито елементи са избрани от стойността на индекса. За разлика от масива, стойностите на индекса на хеш - не малки не-отрицателни числа и всяко скаларна. Тези Scalars (наречени ключове) се използват за стойности проба от масива.

Hash елементи не са в някакъв определен ред. Можете да ги разглеждаме като една купчина от библиографски карти. В горната половина на всяка карта - това е ключът, а долната - стойност. Всеки път, когато ви постави в хеш стойност, нова карта. Когато имате нужда да промените стойността, вие определяте ключа и Perl е необходимо карта. Затова реда на картите, всъщност, не е от значение. Perl държи всички карти (т.е. двойки ключ-стойност) в специален вътрешен ред, което го прави по-лесно за търсене на карти, така че търсенето не е необходимо да се погледне през всички двойки. Редът на карти за съхранение не може да бъде променен, така че дори не се опита. **

Името на хеш променлива се състои от процента (%) знак и буквите, от които могат да отидат на другите букви, цифри и символи подчертават редица нула или повече. С други думи, част от името след знака процента е подобен на

* В старите документи, наречени хешове асоциативни масиви, но бяхме толкова уморени, се прилагат за такова разширяване на концепцията за такъв многосричен термин, ние решихме да го замени с много по-голям успех в едносрични думи.

** модули тип IxHash DB_fiIe и да осигури известна степен на поръчки, но за сметка на значително намаляване на производителността.

съответната част от имената на скаларни променливи и масиви. Освен това, точно както няма връзка между $ Фред и @fred, хеш% Фред променлива има нищо общо с тези обекти.

Най-често хеша е създаден и използван като се позовава на нейни елементи, а не за целия хеш. Всеки елемент хашиш - отделна скаларна променлива, която е достъпна чрез индекс, представляваща стойност на низа и призова ключ. По този начин, препратка към елементите на хеш% Fred се извършва чрез определяне на $ Fred<$ключ> , където $ ключ - всяко скаларна изразяване. Още веднъж, ние подчертаваме, че обжалването на хеш елемент изисква различен синтаксис, отколкото призив към целия хеш.

Както в случая на масиви, новите елементи са създадени чрез определяне на хеш стойности:

$ Фред == "BBB"; # Създава ключ "ААА", стойността на "BBB" $ Фред (234.5> = 456.7; # създава ключа "234 5", стойността на 456.7

С помощта на тези оператори в хеша създадени два елемента. При следващо повикване към елементите (означени с ключовете) обратно предварително записани стойности:

печат $ Фред ( "ААА"); # Показва "BBB" $ Фред

Когато се отнася до несъществуващи елемент връща undef стойност (както при достъп елемент на масива отсъства или неопределен скаларна променлива).

Буквално представяне на хеш

Може да се наложи да се обърнат към сегментиране на цялото - например, да се инициализира или да го копирате в друга хашиш. В действителност, Perl не е буквален хеш формат не е предоставена, така че той просто се появява в списък. Всяка двойка елементи от списъка (който винаги трябва да бъде четен брой елементи) поставя ключа и съответната стойност. Това подробен изглед могат да бъдат причислени към друг хеш, който след това отново се създаде същата хеш. С други думи:

@fred_list =% Fred; # @fred_list получава стойност

# ( "ААА", "ВВВ", "234,5", "456,7")% Барни = @fred_list; # Създаване% Барни като% Fred% Барни =% Fred; # Ускорен метод за извършване на тази задача% гладка "(" ааа "," ВВВ "," 234,5 "," 456,7 ");

# Създаване% гладка като Фред% от буквални ценности

Редът на двойки ключ-стойност в този разширен формат произволно и не подлежи на контрол. Дори и да променяте никакви ценности или да създадете изцяло хеш разширява върнат списък все още ще бъде в реда, в Perl е решил да предостави ефективен достъп до отделните елементи. За всяка отделна последователност не може да се разчита.

Сора% =% оригинал; # Копие от оригиналната% до% Сора

Използване на обратната операция може да създаде хеш, където ключове и стойности разменени:

% Назад = обратната нормална%;

Разбира се, ако% нормално има две еднакви ценности, в% назад те ще се превърне в един от елементите, така че тази операция е най-добре само през хешове с уникални ключове и стойности.

Този раздел изброява някои от опциите, налични за работа с хешове.

Функционални клавиши (% imya_hesha) предоставя списък с всички текущи ключови съществуващата в хеш% imya_hesha на. С други думи, използването на тази функция е равносилно на връщането на списъка на всички елементи на нечетните (първи, трети, пети и т.н.), като разполагането контекст% imya_hesha хашиш в списък, и ги връща, за да функционира ключове в тази последователност. Ако няма елементи в хеш, ключове функция връща празен списък.

Ние прилагаме тази функция, за да хеша на предишните примери:

Olist = ключове (% Fred); # @list получава стойност ( "Ааа", 234.5) или # (234.5, "ААА")

Както при всички други вградени функции, скобите не са задължителни: функционални клавиши% Фред е еднакви ключове (%) на Фред.

foreach ключ $ (клавиши (% Фред)) (# веднъж за всяка стойност на хеш% Фред

печат "на $ ключ имаме $ Фред ($ ключ> \ Н"; # дисплей ключ и стойност>

Този пример показва също, че отделните елементи могат да се определят чрез интерполация в хеш линия в двойни кавички. Всички хашиш, обаче, не може да се интерполира по този начин *.

В контекста на скаларна функция ключове дава броя на елементите (двойки ключ-стойност), съдържащи се в хеш. Например, можете да определите дали хеша е празен, като този:

ако (ключове (% xeni)) <# если keys() не равно 0:

; # Array не е празна)

докато (ключове (% xem) <10)

; # Цикъл да продължи най-малко до 10 елемента>

За да разберете хеша е празен или не, просто трябва да се използва% хеш в скаларна контекст:

ако (% хашиш) (# ако "истинска", има нещо там

Функционални стойности (% array_name) връща списък с всички текущи стойности на посочения масив в същия ред, в който функционалните клавиши (% array_name> ключове връща Както винаги, скобите са по желание например ..:

% Фамилия = 0; #% Фамилия направи празен $ фамилия ( "Фред"> = "Флинтстоун";

Olastnames = стойности (tiastname); # Get ценности

@lastnames масив ще съдържа стойност ( "Флинтстоун", "чакъл"), или ( "чакъл", "Флинтстоун").

За примка върху цялата хеш (т.е. да се тества всеки елемент), можете да използвате функцията ключовете, и да получите стойности по ключова връщане него. В действителност, този метод се използва широко, но по-ефективен начин - да функционира всеки (% imya_hesha), който се връща ключ-стойност чифт като списък от два елемента. Всеки път, когато изчисляването на хеш функцията за връщане следващата ключова такава двойка на, докато всички елементи са проверени. Ако няма повече двойки, всеки се връща празен списък.

* Възможно е по принцип с помощта на разреза, но тук не става дума за съкращения.

Например, за да премине на хеш% фамилия от предишния пример, трябва да използвате нещо като това:

докато (($ на първо място, $ последен) = всеки (% фамилия))

отпечатва "Фамилното име на $ първо е $ миналата \ Н";

Присвояване на нова стойност за целия хеш функция прави всеки ход в началото. Добавяне на елементи към хеша и отстраняването от нея на елементи в хода на цикъла може много добре "обърка" функцията на всеки (и най-вероятно, също).

% Fred = ( "ААА", "ВВВ", 234.5,34.56); #% Фред добави два елемента изтриване $ Фред ( "ААА">; # сега хеширате% Фред е само един ключ-стойност двойка

Както и в случая с променлива масив (до директория или буквално), можете да използвате хеш парче, което ще даде възможност да се справят с нито един от стихията си и едновременно с това да се набор от елементи. Вземете, например, играта на боулинг:

Всичко това може да се запише в един ред:

Но дори и това е твърде дълъг, така че нека да се използва хеш парче:

Това е толкова по-кратък. Можете да комбинирате използването на парче и хеш променлива интерполация:

@players = qwffred Барни Дино);

Печат "резултати са: @score (@players> \ Н";

Hash парчета могат да бъдат използвани да се слеят малък хеш с по-големи. В този пример, хашиш, има по-нисък приоритет, в смисъл, че ако има дубликат ключ от по-ниска стойност е хеш:

Тук стойностите на хеш% резултатът на сливат с хашиш% лига. Това е еквивалентно на много по-бавно операцията:

% Лига = (% класа,% резултат); = #% Рейтинг, за да се слее с% лига

1. Напишете програма, която чете ред, а след това извежда тази линия и съответната стойност в съответствие с таблицата по-долу:

2. Напишете програма, която чете няколко думи (по един на ред) преди края на файла и след това показва обобщена информация колко пъти се срещна всяка дума. (Допълнителна задача: сортиране на думите се появяват на екрана на техните ASCII-стойности във възходящ ред на последните.)

Свързани статии

Подкрепете проекта - споделете линка, благодаря!