|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Perl (13) - HasheHash je další varianta seznamu, kdy indexem jednotlivých hodnot může být jakákoliv skalární hodnota.
Při práci s poli jsme byli dosud omezeni na číselné indexy, které jsou uspořádané. Lze použít i řetězce (v takovém případě spíše než o indexu hovoříme o klíči). To pak již nejde o klasické pole, ale o hash (někdy též nazývaný asociativní pole). Každý prvek hashe obsahuje dvě skalární hodnoty. Můžeme říct, že jde o seznam uspořádaných dvojic, avšak jejich postavení není symetrické, neboť klíč musí být jednoznačný. Hash si můžeme představit i jako matematickou funkci. S hashi se pracuje podobně jako s poli. Na první pohled jsou zřejmé dvě odlišnosti. Hash se označuje procentem a klíč se píše do složených (nikoliv hranatých) závorek. Stejně jako u polí platí, že podle klíče prvku lze jednoznačně zjistit hodnotu, ale nikoliv naopak. Hash plníme hodnotami takto:
Konkrétně:
Na uvození parametrů můžeme samozřejmě použít i nám již dobře známou funkci qw. Následující zápis je ekvivalentní poslednímu uvedenému příkazu:
Další synonymní zápis získáme nahrazením každého lichého operátoru čárky operátorem =>. Operátory , a => mají stejný význam, takže teoreticky by měly jít nahradit i sudé čárky. K tomu ale není důvod. => se užívá pro lepší přehlednost. (V našem případě je sice jasné, co je klíčem a co hodnotou. Ale představme si, že by obojí byly na první pohled od sebe nerozeznatelné řetězce.)
A nakonec úplně nejpřehlednější zápis získáme rozepsáním kódu do více řádků. Každý pár klíč => hodnota bude na jednom.
Navíc se často u klíče hashe vynechávají uvozovky.
Každý z předcházejících kódů vytvořil hash s těmito prvky:
Jednotlivé hodnoty získáme obdobně jako u polí. Jak daleko je to z Prahy do Moskvy?
Vidíme, že je to stejné jako s poli, jen se, jak už bylo zmíněno, klíč píše do složených závorek. Konverze pole - hashPřiřadíme-li pole do hashe, je to jako byste přiřazovali seznam (tedy hodnoty prvků pole).
Zápis má (pro konečný obsah hashe %hash) stejný význam jako tento:
a proto %hash bude obsahovat prvky:
Konverze hash - poleKonverze opačným směrem je samozřejmě také možná. Hash je rozložen na hodnoty klic1, hodnota1, klic2, hodnota2... a ty jsou přiřazeny do pole:
@pole potom obsahuje prvky:
Chování funkce printUvedeme-li jako argument hash, nejdříve se zkonvertuje na pole a až vzniklé pole se tiskne.
Výstupem tedy bude text
Funkce existsTestuje, zda existuje klíč pole. Přičemž nezáleží na tom, zda má definovanou hodnotu. Funkce exists se často používá v podmínkách.
Funkce deleteMaže klíč a vrací jeho hodnotu.
Funkce eachČte prvek hashe.
Příklad vypíše všechny klíče a hodnoty pole. Funkce each vrací klíč a hodnotu prvku. Přitom si pamatuje, které klíče prvky již vrátila a při opakovaném volání v cyklu vrací jiný prvek. Podotkněme, že pro tento příklad se spíše hodí cyklus for.
Funkce keyskeys vrací pole prvků s hodnotami, které jsou klíči hashe.
Vytiskněme ještě klíče v abecedním pořádku:
Funkce valuesVrací hodnoty všech prvků hashe.
Počet prvků hasheZjistíme ho sečtením klíčů hashe:
Příklad - slovníkDnešní díl zakončíme vytvořením programu, který načte ze vstupu slovo a pokud ho má v databázi pojmů, vytiskne jeho význam. Zatím budeme pojmy definovat přímo v programu, což není dobré řešení. Někdy později si předvedeme, jak k tomuto účelu použít externí soubor nebo, ještě lépe, databázi. ŘešeníZe všeho nejdříve bude nutné definovat pár pojmů.
Dále načteme pojem:
Hash necháme prozkoumat cyklem foreach (probereme ho sice až v příštím díle, ale vězte, že do zadané proměnné přiřazuje postupně každý prvek zadaného pole) a pokud se hledané slovo shoduje s názvem pojmu vypíšeme informace a ukončíme. Přitom převedeme všechna písmena na malá, aby nezáleželo na velikosti písmen načteného řetězce. Z tohoto důvodu dále musíme zajistit, aby se tiskly všechny pojmy i v případě, že existuje více pojmů, lišících se jen ve velikosti (tedy konkrétněji - pokud bude dotaz znít URAN, ve výsledcích se musí objevit Uran i uran). Poznámka - ano, je pravda, že takto nebudeme schopni definovat dva stejné pojmy, které se neliší ani ve velikosti (kupříkladu Uran - planeta a Uran - bůh). Pouze můžeme do jedné hodnoty prvku vepsat oba významy.
To je téměř vše. Zbývá nám vytisknout nějakou hlášku v případě, že ve slovníku pojem odpovídající zadanému není. K tomu si definujeme další proměnnou $uspech,
ve které bude pravdivá hodnota, pokud byl hledaný pojem nalezen. V opačném případě zůstane hodnota nepravdivá. Pokud byl pojem nalezen, přiřadíme do ní pravdivou hodnotu. To zapíšeme do těla podmínky uvnitř cyklu.
A v případě neúspěchu tiskneme chybové hlášení.
Zkusme spustit náš program (zdrojový kód):
Až budeme znát regulární výrazy, budeme umět napsat slovník, který hledá i podle části názvu. Další věcí, která by našemu slovníku slušela, by bylo předání hledaného pojmu jako argumentu příkazové řádky.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |