|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Perl (147) - Perl 6 - regulární výrazy, nové operátoryV minulém dílu jsme opomněli dvě zásadní témata. Regulární výrazy prošly od Perlu 5 obrovskou změnou. Podobně bychom mohli mluvit o nových operátorech.
Regulární výrazy (rules)Na začátek povězme, že staré regulární výrazy lze nadále používat. Syntaxe pro to je následující.
Avšak regulární výrazy prošly revolučními změnami. V Perlu 5 mají dle Larryho Walla několik zásadních nedostatků. Je určitě zajímavé zamyslet se nad následujícími body.
Perl 5 podporoval tzv. regexes, což jsou regulární výrazy rozšířené oproti jejich formální definici (my v seriálu nejsme úplně korektní a tyto pojmy zaměňujeme). Perl 6 bude obsahovat novou soustavu regulárních výrazů pod názvem rules (pravidla). Pro detailní informace je nejvhodnější nahlénout do specifikace. V Perlu 6 je syntaxe a možnosti regulárních výrazů hodně odlišná od předchozích verzí. Mění se i filozofie, s jakou je k regulárním výrazům přistupováno. V Perlu 5 byly regulární výrazy od zbytku programu dost oddělené - byl to speciální řetězec, jehož význam se řídil vlastními pravidly a na první pohled bylo jasně vidět, že regulární výraz je něco jiného než zbytek programu. To se nyní změnilo a regulární výrazy jsou do jazyka daleko více zabudované. Co se nezměniloNejzákladnější vlastnosti se neliší.
Drobné změnyTéměř vše ostatní se ale změnilo. Podívejme se, co se stalo s několika často používanými konstrukcemi.
Formální gramatiky, modifikátoryV Perlu 6 lze daleko intuitivněji definovat pravidla pro formální gramatiky. Například, mějme jazyk, který můžeme chápat jako množinu slov L = {anbabn | n > 0} (mimochodem, nejde o regulární jazyk). To lze v Perlu přepsat do pravidla následovně pomocí deklarátoru rule (které se používá k deklaraci pojmenovaného nebo anonymního regulárního výrazu).
Zde je jiný způsob. Velmi přehledně lze přepisovat gramatiky. Pravidla pro tvorbu slov jsou v našem jazyku následující.
Totéž tedy bude dělat toto pravidlo.
Dále existují také deklarátory regex, rx a token, které se liší v tom, jaké modifikátory jsou automaticky aktivní. Máme na výber z mnoha modifikátorů. Uvádějí se uvozené dvojtečkou za jméno pravidla (tj. podobně jako atributy u podprogramů) nebo před regulární výraz (je-li anonymní, například m:i:g/hledane_slovo/). Zde je několik příkladů modifikátorů.
Perl 6 navíc umožňuje definici vlastních modifikátorů. Pro obsáhlejší informace o modifikátorech lze doporučit nahlédnutí do dokumentace. Klíčové slovo grammar deklaruje jmenný prostor pro pravidla. Názorněji si představme grammar jako analogii package. package obsahuje metody, podobně grammar obsahuje nějaké regulární výrazy. Uveďme si hodně umělý příklad na validaci emailové adresy, na kterém ale uvidíme, jak se výše uvedené používá. Používá se Backus-Naurova normální forma.
Nyní se můžeme vně jmenného prostoru například na regex email odvolávat jako na Email::Simple::email. Jak tedy ověříme správnost emailu?
Nové operátoryPodívejme se, jaké nové operátory nám Perl 6 přináší. Již jsme se s některými setkali v minulém dílu a nyní se věnujme dalším. Na úvod je dobré se alespoň letmo podívat na kompletní přehled operátorů, kde uvidíme desítky úplně nových. Výraz pro vícenásobné porovnáváníNově lze zřetězit operátory pro porovnávání. Lze tak vytvořit následující podmínku.
Nové operátory pro kartézský součin a operace po složkáchOperátor X je tzv. metaoperátor, což je velmi zajímavá věc. Základní použití je následující.
Použití však je daleko širší, neboť lze specifikovat, jakým operátorem mají interagovat každé dva prvky. Implicitně je to čárka. Lze ale použít i jiné operátory. Operátor uvedeme za X.
Stojí za zamyšlení, jak bychom libovolný z uvedených příkladů napsali v Perlu 5. Pro operace po složkách lze stejným způsobem použít operátor Z. Vždy spolu interagují ntý prvek v pravém seznamu a ntý prvek v levém seznamu. Podívejme se, jak efektně můžeme v Perlu 6 sčítat vektory nebo tvořit hashe.
Definice vlastních operátorůV Perlu 6 máme následující typy operátorů.
Jak bychom například vytvořili a použili operátor pro zaokrouhlování (za předpokladu, že máme funkci round)?
Měli bychom ale také specifikovat prioritu právě definovaného operátoru a asociaci. To uděláme v případě priority pomocí slov equiv, tighter, looser vzhledem k již existujícím operátorům a pomocí assoc s parametrem left, right nebo none. Například takto.
Pomocí multi můžeme také přetěžovat již existující operátory. Generování posloupností číselPerl 6 zavádí nový třítečkový operátor pro rozsahy s líným vyhodnocováním. Díky němu můžeme elegantně generovat různé aritmetické a geometrické posloupnosti.
Co když chceme omezenou posloupnost, ale nevíme z hlavy poslední člen? Co například mocniny dvou do 10000?
To bohužel fungovat nebude, protože vygenerovaný člen je vždy porovnáván s posledním na rovnost. Příklad tedy vygeneruje nekonečnou posloupnost. Avšak existuje trik, který ji ukončit dokáže, i když poslední člen nevíme.
Místo >= lze použít i jiný operátor. Tato konstrukce je zkratkou za uzávěr -> $a {$a >= 10000}. Totéž lze nezkráceně napsat takto.
Když chceme generovat posloupnost, která není ani aritmetická ani geometrická, musíme ji definovat jako lambda funkci. Vzpomeňme si, jak jsme psali podprogram na výpočet Fibonacciho posloupnosti. Takto ji přiřadíme do pole v Perlu 6.
S trochou magie lze totéž přepsat takto.
Výsledek po operaci ... lze samozřejmě přiřadit do pole.
Prvních 6 elementů vytiskneme takto.
Další změny v operátorechPodívejme se v bodech na několik zajímavých změn.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |