Серг Яковлев
Хешът може да бъде определен по няколко начина:
Ако при дефинирането на хеш елемент се използва интервал, тогава е по-добре да поставите това пространство в единични кавички $ hash = 'grey';
Можете да добавяте елементи към хеша по следния начин:
достъп до елементи
Функцията за изтриване може да бъде извикана за нарязване на хеш, който изтрива всички посочени ключове: delete @hash; вижте perlfunc (1)
Ако трябва да намерите съвпадащи ключове или не са включени в друг хеш, тогава трябва да потърсите хеш ключове с помощта на ключове и да проверите дали текущият ключ е в друг хеш. Намиране на съответстващи ключове:
Преобразуваната връзка не може да бъде върната в предишния си вид, тъй като той се е променил от връзка към низ. Трябва да създадете персонализиран хеш, като ключовете са връзките, превърнати в низове, а стойностите са действителните връзки.Можете да използвате модула Tie: RefHash. Примерът показва използването на I/O обекти за работа с файлови манипулатори.
Ако неопределена стойност undef се използва като ключ, тя се преобразува в празен низ. undef е напълно валидна хеш стойност. Но при извличане на стойност за ключ, който не е в хеша, perl ще върне undef. Можете да проверите за ключ като този: съществува ($ хеш); сигурност на свързаната стойност: дефинирана ($ хеш); истина: if ($ hash); ... Понякога undef трябва да се кешира, т.е. Ключът е там, но с него не е свързано нищо полезно, например програма, която определя размера на файловете от предадения списък:
буталната линия съдържа многозначната хеш версия на $ tty = $ tty. Всички имена на терминали се интерполират в реда print @> .
Пример за програма, която дава свойство на името на обект и обратно:
Каква е разликата между delete и undef за хешове?
Сега нека разгледаме операцията по премахване на елемент от хеша: след това таблицата ще изглежда така: Състоянията на елементите в хеша вече са различни, промените са показани, както в предишния пример, в различен случай . от: [email protected]
Предимството на всеки от тях е, че двойките ключ/стойност се извличат един по един. Ако хешът съдържа твърде много ключове, предварителното съставяне на пълния списък може да спести значителна памет и време, но всяка функция не контролира реда в които двойките се обработват. Преминаването на хеш с докато е жадно за памет. Можете да форматирате изхода по какъвто начин искате, само с две скаларни променливи, ключ и стойност.
Цикълът foreach итерира върху предварително изграден списък с ключове, така че след началото на цикъла той не знае нищо за ключовете, добавени или премахнати, ключовете, добавени вътре в цикъла, не се включват автоматично в списъка с ключове за повторение и ключовете премахнати вътре в цикъла не се премахват от този списък.
Съдържанието на хеш може да се покаже по следния начин:
Изход на хеш в един ред.
можете да използвате функцията за карта: отпечатайте карта $ hash \ n "> ключове% hash;
функцията map ви позволява да работите с елементи във всякакъв ред, в този случай се създава списък с низове (ключ => стойност) и се предава на функцията за печат. Ако съхранявате хеш във временен масив, той ще бъде изведен като низ:
в последните два случая интерполираме хеша като списък, който не предвижда или контролира реда, в който се извеждат двойките ключ/стойност. Данните в последните два случая се показват като списък с ключове и стойности, елементите на които са разделени от текущото съдържание на променливата $ ", т.е. няма да е възможно да се показват всяка двойка стойности на нов ред или отделни ключове от стойности с произволен символ. Тук има програма, която чете файла на пощенската кутия и показва броя на съобщенията от всеки подател, подателят се идентифицира от реда From (целта на програмата е само да илюстрира хеш операции):
Хешът се обръща с помощта на обратната функция, при която свързаните стойности на оригиналния хеш са ключове и обратно. Нека използваме списъчната еквивалентност на хешове. В контекст на списък, обратното интерпретира% хеш като списък и разменя съставните му елементи. Например: имаме хеш% Glavfish = ("seledka" => "mokraia", "skat" => "elektricheskij"), ако го интерпретираме като списък, получаваме следното ("seledka", "mokraia", "skat", "elektricheskij"), след обръщане на списъка изглежда така: ("elektricheskij", "skat", "mokraia", "seledka"), интерпретирайки го като хеш дава следното: ("elektricheskij" = > "skat", "mokraia" => "seledka") .
Изходът на хеш в ред за вмъкване с помощта на Tie: IxHash
За да прегледате хеш елементи в реда на вмъкване, тъй като ключове и всеки дисплей хешира елементи по неподреден начин, можете да използвате модула (или операции с масиви) Tie: IxHash
Модулът Tie: IxHash кара функциите ключове, всеки и стойности да връщат елементи в реда, в който са въведени в хеша. Ако нямате такъв модул IxHash.pm, тогава трябва да отидете на CPAN/модули, да го намерите и да го инсталирате, ако нямате разрешение за инсталиране на библиотеки, тогава в първия ред на скрипта трябва да напишете # !/Put '/ do/perl'a - wT -I/put'/do/nugnogo/modulia и инсталирайте модула във вашата домашна директория. Пример за използване на Tie: IxHash:
Изходът на хеш в ред за вмъкване без използване на Tie: IxHash
Без модула Tie: IxHash изходът на хеша в реда на вмъкване може да се извърши чрез добавяне на числова информация към хеша. Има файл news.dat, който се показва от скрипта в реда, в който данните се въвеждат във файла. Необходимо е едновременно да изтриете повече от един ред от текста (няма значение дали е ред или да го отделите, той се определя уникално от $/променливата).
Нека да обясним как работи скриптът. Първоначалната задача е следната: на входа има няколко квадратчета за отметка от формуляра, в които могат да се поставят повече от едно квадратче за отметка. Необходимо е да се намерят и зачеркнат маркираните редове. Файлът news.dat съдържа редове от формата: 12345678tra-ta-ta [AAA] Полето за отметка е маркирано с текста tra-ta-ta, т.е. нещо като