Működési perl (láma könyv)
* Hash tömb hasonló tekinthető a fenti, amely egy sor skaláris adat, amelynek elemeit által kiválasztott index értéke. Ezzel szemben a tömb, az index értéke a hash - nem a kis nem-negatív egész számok, és a bármilyen skalár. Ezek a skaláris (úgynevezett kulcsok) használunk a minta értékeket a tömb.
Hash elem nem az adott sorrendben. Akkor tekintik őket, mint egy köteg bibliográfiai kártyákat. A felső fele minden kártya - ez a kulcs, és az alsó - érték. Minden alkalommal, amikor tegye a hash érték, egy új kártyát. Ha meg kell változtatni az értéket, akkor adja meg a kulcsot, és Perl szükséges kártyát. Ezért az, hogy a kártya, sőt, nem számít. Perl tartja a kártyát (azaz kulcs-érték párok) egy speciális belső rend, amely megkönnyíti keresni konkrét kártyák, így a keresés nem szükséges átnézni az összes párt. Az, hogy a tároló kártyát nem lehet megváltoztatni, így nem is próbálja meg. **
Név hash változó áll százalék (%) jele és a betűket, amelyek mehet a másik betűket, számokat és szimbólumokat aláhúzás számos nulla vagy több. Más szóval, a név egy részét, miután a százalék jel hasonlít a
* A régi dokumentumok úgynevezett hash asszociatív tömbök, de nem voltunk olyan fáradt kell alkalmazni az olyan fogalmának kiterjesztését az ilyen többszótagú kifejezés, úgy döntöttünk, hogy helyette egy sokkal sikeresebbek monosyllables.
** modulok típusa IxHash DB_fiIe és bizonyos mértékben a megrendelés, de a költségek jelentős csökkenése teljesítményt.
vonatkozó részének a nevét skalár változókat és tömböket. Sőt, mint ahogy nincs összefüggés a $ Fred és @fred, hash% Fred változó semmi köze ezeket a tárgyakat.
Leggyakrabban a hash által létrehozott és használt hivatkozva annak elemei, és nem a teljes hash. Mindegyik hash elem - egy külön skalár változó keresztül elérhető egy index képviselő értékre és az úgynevezett kulcsot. Így a hivatkozás az elemek a hash% Fred által meghatározva a $ fred<$ключ> , ahol a $ kulcs - bármilyen skalár kifejezés. Ismét hangsúlyozzuk, hogy a fellebbezés a hash elem igényel más szintaxist, mint a fellebbezést teljes hash.
Mint abban az esetben a tömbök, az új elemek jönnek létre hozzárendelésével hash:
$ Fred == "bbb"; # Létrehoz egy gombot "AAA", az értéke "bbb" $ Fred (234,5> = 456,7; # létrehozza a kulcsot "234 5", az értéke 456,7
Ezekkel szolgáltatók a hash létre két elem. Amikor ezt követő hívás elemet (ezt jelzi a billentyűk) vissza a korábban rögzített értékek:
print $ Fred ( "AAA"); # Kijelzők "bbb" $ Fred
Amikor hivatkozva egy nem létező elem visszatér undef értéket (például elérésekor a tömb elem hiányzik, vagy nem definiált skalár változó).
A szó a hash
Lehet, hogy kapcsolja hash az egész - például inicializálni vagy másolja át egy másik hash. Tény, Perl nincs szó méret hash nem áll rendelkezésre, így csak megjelenik egy listán. Minden pár eleme a listán (ami mindig páros számú elem) határozza meg a gombot, és a megfelelő értéket. Ez a részletes nézet lehet rendelni egy másik hash, ami aztán újra létrehozni az azonos hash. Más szavakkal:
@fred_list =% Fred; # @fred_list értéket kap
# ( "AAA", "bbb", "234,5", "456,7")% Barney = @fred_list; # Létrehozása% Barney mint% Fred% Barney =% Fred; # Gyorsított eljárás ennek a feladatnak% sima "(" AAA "" bbb "" 234,5 "" 456,7 „);
# Készítsen% sima, mint Fred% -a literálértékeket
Az, hogy a kulcs-érték párokat ebben a kibővített formája tetszőleges, és nem támadható, hogy ellenőrizzék. Még ha megváltoztatja értékeket, vagy létrehozhat teljesen hash visszatért kibővített listája továbbra is abban a sorrendben, Perl döntött, hogy hatékony hozzáférést az egyes elemek. Ahhoz, hogy bármely adott szekvencia nem lehet számolni.
Sora% =% eredeti; # Másolata% eredeti% Sora
Reverz művelet lehet létrehozni egy hash, ahol kulcsok és értékek felcseréljük:
% Visszafelé = reverz% normál;
Természetesen, ha a% normál két azonos értékek% -ban hátrafelé fognak alakulni egyik eleme, ezért ezt a műveletet legegyszerűbben csak több hash egyedi kulcsokat és értékeket.
Ez a rész néhány a lehetőségek kezelésére rendelkezésre álló összegeket.
Funkcióbillentyűk (% imya_hesha) felsorolja az összes aktuális kulcs létezik a hash% imya_hesha. Más szóval, az ezzel a funkció megegyezik a visszatérő listáját minden eleme a páratlan számú (első, harmadik, ötödik, stb) telepítésével hash% imya_hesha keretében egy listát, majd visszaállítja funkciógombjaira ebben a sorrendben. Ha nincsenek elemek a hash, kulcsok függvény egy üres lista.
Alkalmazzuk ezt a funkciót a hash az előző példákban:
Olist = kulcsok (% Fred); # @list kapja az értéket ( "Á", 234,5) vagy a # (234,5, "AAA")
Mint minden más, beépített függvények, a zárójelek opcionális: funkcióbillentyűk% Fred azonos kulcsokat (% Fred).
foreach $ key (kulcs (% Fred)) (# egyszer minden értéke a hash% fred
print "A $ kulcs van $ Fred ($ key> \ n"; # kijelző kulcs és az érték>
Ez a példa is mutatja, hogy az egyes elemek az interpolált a hash sorban idézőjelbe. Minden hash azonban nem interpolált ily módon *.
A skaláris funkcióbillentyűk összefüggésben megadja az elemek száma (kulcs-érték párokat) tartalmazott a hash. Például, akkor lehet meghatározni, hogy a hash üres, mint ez:
if (gombok (% xeni)) <# если keys() не равно 0:
; # Array nem üres)
while (billentyűk (% XEM) <10)
; # Ciklus hogy folytatódik, amíg legalább 10 elemek>
Annak érdekében, hogy megtudja, a hash üres vagy nem, akkor csak meg kell, hogy használja a% hash egy skalár összefüggésben:
if (% hash) (# ha "valódi", van ott valami
Függvényértékeket (% array_name) visszatér egy listát az összes aktuális értékei a megadott tömb ugyanabban a sorrendben, amelyben a funkcióbillentyűk (% array_name> billentyűk visszatér Mint mindig, zárójelek opcionális példa ..:
% Lastname = 0; #% Lastname hogy üres $ lastname ( "Fred"> = "Flintstone";
Olastnames = értékek (tiastname); # Get értékek
@lastnames tömb tartalmaz egy értéket ( "Flintstone", "törmelék"), vagy a ( "törmelék", "Flintstone").
Mert hurok az egész hash (azaz tesztelni minden elem), akkor a funkcióbillentyűk, és kap értékeket key return azt. Valóban, ez a módszer széles körben használják, de van egy hatékonyabb módja - működéséhez egyes (% imya_hesha), amely visszatér a kulcs-érték pár, mint egy két elemből álló listát. Minden alkalommal, amikor a számítás a hash függvény visszatérési következő kulcs-érték pár, amíg az összes elem be van jelölve. Ha nincs több pár, minden visszatér egy üres lista.
* Lehetőség van elvileg révén a vágás, de itt nem beszélünk darabok.
Például, hogy adja át a% lastname hash az előző példában, akkor ezt valahogy így:
while (($ először $ előző) = each (% lastname))
print „Az utolsó név a $ első $ utolsó \ n”;
Hozzárendelése egy új értéket a teljes hash függvény ami minden egyes lépés az elején. Elemek hozzáadása a hash, és az eltávolítása is az elemek során a ciklus nagyon is „megzavarja” a függvény minden egyes (és valószínűleg is).
% Fred = ( "AAA", "bbb", 234.5,34.56); #% Fred hozzá két elem törlése $ Fred ( "AAA">; # most hash% Fred csak egy kulcsértékpár
Mivel a tömb esetében változó (a könyvtárba, vagy szó), akkor egy hash szelet, hogy lehetővé teszi, hogy kezelni nem az egyik elem, és ezzel egyidejűleg egy sor elemet. Vegyük például a játék bowling:
Mindez lehet írni egy sort:
De még ez is túl hosszú, úgyhogy egy hash szelet:
Ez annyira sokkal rövidebb. Akkor össze a használata a szelet és a hash változó interpoláció:
@players = qwffred Barney dino);
print "pontszámok: @score (@players> \ n";
Hash szeleteket is fel lehet használni, hogy egyesíti a kis hash nagyobbak. Ebben a példában a hash alacsonyabb a prioritása, abban az értelemben, hogy ha van egy duplikált kulcsot kisebb érték egy hash:
Itt az értékek a hash% pontszám egyesül a hash% bajnokságban. Ez megegyezik a sokkal lassabb művelet:
% League = (% liga,% pontszám); = #% Score egyesülni% liga
1. Készítsünk programot, amely beolvas egy sort, és ezután kiadja ezt a sort és a megfelelő értéket ér el az alábbi táblázat tartalmazza:
2. Készítsünk programot, amely beolvassa a szavak száma (soronként) vége előtt a fájlt, majd megjelenít egy összefoglalót hányszor szót teljesülnek. (Plusz feladat: A legújabb szavak jelennek meg a képernyőn az ASCII-értékek növekvő sorrendben az utóbbi.)