Hashes (matrice asociative) în perl

Hash este o matrice asociativă, deoarece accesul la date se realizează utilizând o cheie asociată cu valoarea. Hashes începe cu prefixul%. % hash. Pentru a lucra cu arhitecturi hash, aveți nevoie, ca și în rețelele normale, să utilizați prefixul de dereferencing $. $ hash = gri;

Hash-ul poate fi definit în mai multe moduri:

Dacă un spațiu este folosit atunci când se definește un element hash, atunci este mai bine să puneți acest spațiu în citate simple $ hash = gray;

Adăugați elemente la hash ca acesta:

Verificarea hash-ului pentru element:

Ștergeți un element din hash utilizând funcția de ștergere.

Funcția de ștergere poate fi apelată pentru a forfeca hash-ul, ceea ce face ca toate tastele să fie șterse: delete @hash; consultați perlfunc (1)

Pentru a organiza bucle pe elementele hash, trebuie să utilizați fiecare funcție:

Pentru a enumera elemente ale unui hash nu prea mare, puteți folosi foreach:

Avantajul fiecăruia este că perechile cheie / valoare sunt extrase unul câte unul.În cazul în care hash conține prea multe chei, eșecul de a pre-construi o listă completă economisește semnificativ memoria și timpul, însă funcția nu vă permite să controlați ordinea de procesare a perechilor. Enumerarea hash folosind în timp ce petrece puțină memorie. Puteți să formatați rezultatul în orice mod, cu doar două variabile scalare, o cheie și o valoare.

iterează buclă foreach pe o listă de chei de pre-construite, astfel încât el nu știe nimic după începerea ciclului cu privire la adăugarea sau eliminarea cheilor, se adaugă cheile în ciclu, nu sunt incluse automat în lista de chei cautate si cheile de la distanta in interiorul buclei nu va fi șters din listă.

Conținutul hash poate fi, de asemenea, dedus:

Iesire de ieșire într-o singură linie.

Puteți utiliza funcția hartă. tipăriți hartă $ hash \ n "> chei% hash;

funcția hartă vă permite să lucrați cu elementele în orice ordine, în acest caz este creată o listă de șiruri de caractere (key => value) care au fost transmise funcției de tipărire. Dacă salvați hash-ul într-o matrice temporară, acesta va fi afișat ca un șir:

De asemenea, puteți extrage hash-ul și astfel: print "@ \ n";

în ultimele două cazuri, am interpola hash ca o listă, care nu permite de a prevedea sau controla ordinea de perechi de O „cheie / valoare“. Datele din ultimele două cazuri sunt afișate într-o listă de chei și valori, elementele care sunt separate de conținutul curent al $. „Adică, nu va fi în măsură să deducă valorile fiecărei perechi pe o linie separată sau taste separate, de la valori în orice caracter. Aici este un program care citește mailbox fișier și afișează numărul de mesaje de la fiecare expeditor, expeditorul este determinată de la linia (obiectivul programului este numai pentru a ilustra funcționarea cu hash-uri):

Rulați cititorul cutiei poștale: bash-2.03 $ ./1.pl / usr / home / vovka / mbox

Pentru a enumera elementele hash în ordinea inserării, deoarece chei și fiecare ieșire elementele hash neordonate, puteți utiliza modulul Tie :: IxHash

Modulul Tie :: IxHash determină funcționarea tastelor. fiecare și valorile pentru a returna elemente în ordinea în care sunt adăugate la hash. Dacă nu aveți un astfel de modul IxHash.pm, trebuie să mergeți la CPAN / module. găsiți-o și instalați-o, dacă nu aveți drepturi de instalare a bibliotecilor, atunci în prima linie a scriptului trebuie să scrieți #! / put '/ do / perl'a -wT -I / put' / do / nugnogo / modulia. Exemplu de utilizare a Tie :: IxHash:

consultați documentația pentru modulul Tie :: IxHash.

linia de împingere conține versiunea $ tty = $ tty pentru un hash cu mai multe valori. Toate denumirile terminalelor sunt interpolate în linia de imprimare @>.

Inversarea hash-ului se face folosind funcția inversă. în care valorile asociate ale hash-ului sursă sunt chei și invers. Folosim lista echivalenta a hash-urilor. În contextul listei, inversul interpretează% hash ca listă și swap elementele constitutive ale acesteia. De exemplu: avem un hash% Glavfish = ("seledka" => "mokraia", "skat" => "elektricheskij"). dacă este interpretată ca o listă, primim următoarele ("seledka", "mokraia", "skat", "elektricheskij"). după inversare, lista arată astfel: ("elektricheskij", "skat", "mokraia", "seledka"). interpretarea lui ca un hash dă următoarele: ("elektricheskij" => "skat", "mokraia" => "seledka"). Un exemplu de program care oferă proprietății numele subiectului și invers:

Sortarea cheilor prin alfabetul valorilor asociate:

Sortați după lungimea valorilor asociate:

Exemplu din fido7.ru.perl. Mergând hashes-ul se face ca și matricea de fuziune:

Pentru a economisi memoria, puteți folosi acest cod:

Dacă trebuie să găsiți chei de potrivire sau nu într-un hash prieten, trebuie să organizați cheile hash cu chei și să verificați dacă cheia curentă este într-un alt hash. Căutați cheile de potrivire:

Căutați chei care lipsesc de la alte hash-uri:

Linkul convertit nu poate fi returnat la formularul anterior, deoarece este de la link-ul transformat într-un șir. Trebuie să creați un hash special, cheile căruia sunt linkuri convertite în șiruri, iar valorile sunt legături reale. Puteți folosi modulul Tie :: RefHash. Exemplul arată utilizarea obiectelor I / O pentru manipularea manipulatorilor de fișiere.

Dacă valoarea nedefinită undef este folosită ca cheie. atunci acesta este convertit într-un șir gol. undef este o valoare complet validă în hash. Dar dacă selectați o valoare pentru cheia care nu este prezentă în hash, perl va reveni undef. Verificați prezența cheii după cum urmează: există ($ hash); definitivitatea valorii asociate: definită ($ hash); true: dacă ($ hash); Uneori undef ar trebui să fie stocat în memoria cache, adică există o cheie, dar nu este asociată nimic util, de exemplu un program care determină dimensiunea fișierelor din lista transferată:

Acest cod vă permite să săriți fișierele inexistente și zero, dar înregistrate în lista originală.


Cum pot pune un hash într-un șir? De exemplu, o problemă:

tnc> Mulțumesc, tovarăși :-)
tnc> Înainte de asta am dopat deja. A doua întrebare: există jurnale http-gw. Dirtyness lor
tnc> este că pentru fiecare cerere din jurnal apare 4 linii,
tnc> nu merg neapărat într-un rând:

Creați un hash și păstrați în el acele linii care sunt în continuare, aproximativ vorbind, nu sunt închise, dar pe măsură ce închideți - ștergeți. Desigur, o piesă notabilă din fișierul din memorie va fi prezentă, dar nu chiar la fel. Prin câte linii există al patrulea de la primul? Dacă o medie de câteva miliarde, atunci - în morgă :-)

Ceva ca Exemplul de lucru cu hash și o bază de date de la fido7.ru.perl (a se vedea răspunsul): Cum să treci un hash unei funcții? fido7.ru.perl (a se vedea întreaga discuție)

opțiunea cea mai simplă și cea mai stângăcioasă este să faci un hash cu potriviri de tip i => ya pentru a împărți liniile și a înlocui elementele matricei rezultate cu cele de care ai nevoie. ceva de genul:

Variabilele de mediu care utilizează hashes built-in și% INC matrices. % SIG. % ENV. % FORM<>.

% INC conține numele fișierelor incluse în comanda "Do și necesită". Cheia este numele fișierului, valoarea căii spre fișierul inclus. Matricea @INC conține o listă de directoare care se uită la perl pentru a executa comanda do, require sau use.

% SIG este un hash care stochează utilizatorii pentru diferite situații care apar în perl. De exemplu, șirul local $ SIG = sub<>; dezactivează mesajele de avertizare.

% ENV conține valorile variabilelor de mediu (mediu) specificate la momentul executării scriptului (script). Cheile sunt, de obicei, numele variabilelor de mediu (dar compoziția lor depinde de sistemul de operare), schimbarea acestor valori va provoca o schimbare de mediu pentru procesele descendenților. programul produce:

Direct din script, elementele hash% ENV pot fi numite $ ENV sau $ ENV. Privind că este necesar să provoace.

% FORM conține date introduse din formular folosind metoda POST: formularul html este după cum urmează:






Dacă vom intra în câmpul name1 QWE, RTY nume2, NAME3 asd și apăsați Trimitere, datele sunt transmise prin intermediul STDIN ca: nume1 = qwename2 = rtyname3 = asd și hash

Câmpurile de nume * pot primi $ FORM. $ FORM, etc.