|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
bootable [55]
commercial [7] no-commercial [42] unclassified [20] [7]
Software (10844)
|
Perl (25) - Regulární výrazy - závěrV posledním díle věnovaném regulárním výrazům se podíváme na měření rychlosti a debugging.
Porovnání rychlosti několika regulárních výrazůPro měření času potřebného pro vykonání určitého úseku kódu se v Perlu obvykle používá modul Benchmark. Nyní si ukážeme pouze to, jak pomocí něj porovnávat rychlosti regulárních výrazů. To ovšem není zdaleka jediné užití. Benchmark se používá poměrně často a někdy později v seriálu si podrobněji rozebereme i jeho jiné funkce. Modul Benchmark načteme takto:
use Benchmark qw(:all);
Nyní využijeme jen jeho jedinou funkci a to cmpthese. Ta se používá právě pro porovnávání rychlostí jednotlivých úseků kódu. Jako parametr jí jsou předávany 2 hodnoty:
My si zkusíme dokázat, že použití závorek s pamatováním hodnoty uvnitř nich je časově náročnější než speciální syntaxe závorek, která si svůj obsah nepamatuje. Nejprve se musíme konkrétně rozhodnout, které regulární výrazy budeme porovnávat. Jako ukázku si zvolíme například tyto:
my $re1 = qr/X(\w)/o; Dále je třeba určit s čím se budou tyto regulární výrazy porovnávat. Protože testujeme pouze rychlost závorek, musí být jediným odlišným faktorem v regulárním výrazu právě závorky a vše ostatní musí být stejné. To platí i o řetězcích, které budeme se vzory porovnávat. V opačném případě by to mohlo ovlivňovat rychlost. Nastavíme tedy parametry funkce cmpthese. Předáme jí hash, jehož klíči budou nějaké unikátní řetězce (jména porovnávaných úseků) a hodnotami anonymní podprogramy, v nichž probíhá test regulárního výrazu. Testovaný úsek bude obsahovat určitý počet porovnání nějakého řetězce s regulárním výrazem. Proto musíme definovat řetězec a počet porovnání (obě tyto hodnoty budou pro testování obou regulárních výrazů stejné). Jako řetězec, který bude srovnáván, definujeme podřetězec "X5 " uvnitř dvou stejných podřetězců.
my $okoli = "zxcvasdf" x 500; Nastavíme počet opakování:
my $pocet_opakovani = 1000;
Ještě nám zbývá zadat 1. argument - minimální počet sekund, po které porovnávání poběží:
my $delka_testu = -3;
A můžeme volat cmpthese:
cmpthese($delka_testu, { Po chvilce čekání program vytiskne výsledky ve formě tabulky, seřazené podle rychlostí vzestupně. Sloupec Rate udává hodnotu, kolikrát byl proveden daný úsek kódu (tj. 1000 porovnávání) za sekundu. Další sloupce ukazují relativní rozdíl rychlostí každé dvojice úseků v procentech. V našem případě je tato dvojice jediná (nebereme v potaz pořadí), protože jsme k porovnávání zadali pouze 2 úseky. $ perl cmpthese Rate s pamatovanim bez pamatovani s pamatovanim 115/s -- -31% bez pamatovani 168/s 46% -- $ Pokud si zkusíte pohrát se vstupním řetězcem (změna délky, pozicí apod.), zjistíte, že poměr rychlostí záleží i na dalších okolnostech a to dost výrazně. Vždy by ale mělo být rychlejší porovnávání bez pamatování. Zpracování regulárních výrazůZpůsob, kterým se zpracovávají regulární výrazy můžeme kontrolovat. Ne že by se debugging používal masově, ale v případech, kdy potřebujeme opravit nějakou chybu v rozsáhlém regulárním výrazu a nemáme tušení, kde by mohla být, může pomoci. V Perlu máme možnost zapnout sledování překladu a následného vyhodnocování pomocí jedné z následujících direktiv. Direktiva
use re "debug";
zapíná debugging. Budou tak nalezeny a podrobně rozepsány všechny regulární výrazy. Lze užít také přehlednější variantu se zvýrazněním:
use re "debugcolor";
Zkusíme tímto způsobem otestovat nějaký jednoduchý úsek kódu.
use re "debugcolor"; Program jako obyčejně spustíme:
$ perl debug.pl
Objeví se výpis. My si vysvětlíme pouze to nejdůležitější z něj. Začneme tímto úsekem: 1: BOL(2) 2: EXACT <xy>(4) 4: CURLY {6,6}(7) 6: DIGIT(0) 7: STAR(10) 8: EXACT <z>(0) 10: OPEN1(12) 12: EXACT <1>(14) 14: CLOSE1(16) 16: EOL(17) 17: END(0) Každá položka nebo skupina položek (můžeme jim říkat uzly) vyjadřuje nějakou část regulárního výrazu. Číslo na začátku každého řádku je id uzlu. Za každým uzlem je v závorce id následujícího uzlu. BOL znamená prázdný řetězec na začátku řádku - tedy ^. EXACT je přesná shoda řetězce mezi < a > - v našem případě xy. Kvantifikátor {6} je převeden na obecnější zápis {6,6}. 6krát se opakuje vše odsazené - v našem případě jen uzel DIGIT, který označuje numerický znak. Pokračujeme přesným výskytem znaku s libovolným počtem opakování. Dále máme 1. otevírací závorku. Vše mezi OPEN1 a CLOSE1 je uloženo v $1, vše mezi OPEN2 a CLOSE2 v $2 atd. EOL označuje prázdný řetězec na konci řádku - znak $ - a konečně END je vždy na konci. Toto zatím nemá se srovnávaným řetězcem nic společného. Probíhá pouze překlad regulárního výrazu. Porovnávat se bude až v další fázi. Uvádím tabulku několika častých uzlů. Kompletní je k vidění v manuálové stránce perldebguts.
V tuto chvíli máme regulární výraz zkompilován a můžeme se pustit do porovnávání.
Matching REx `^xy\d{6}z*(1)$' against `xy123456zzz1'
Následují řádky, které postupně srovnávají zkompilovaný regulární výraz se vzorem. Syntaxe se liší podle toho, zda používáte direktivu use re "debug"; nebo use re "debugcolor";. V prvním případě je následovná:
pozice_ve_srovnávaném_řetězci <vyhovující_podřetězec> <zbývající_podřetězec> | id uzel
Konkrétně může vypadat třeba takto:
11 <xy123456zzz> <1> | 10: OPEN1
debugcolor má tu výhodu, že spojuje <vyhovující_podřetězec> a <zbývající_podřetězec>. Vyhovující podřetězec je bíle podbarven (v článku tučně zeleně). Varianta s debugcolor je hlavně díky této vlastnosti o mnoho přehlednější. Vezměme teď výstup řádek po řádku.
0 <xy123456zzz1> | 1: BOL 1. řádek ukazuje vždy výchozí stav. Na dalším je již úspěšně nalezen znak ^ (ten je samozřejmě v každém řetězci), který ale není viditelný - proto jsme stále na pozici 0. Zajímavější je to na 3. řádku. Podbarven máme podřetězec xy. Vyhovuje totiž uzlu EXACT <xy>.
8 <xy123456zzz1> | 7: STAR Právě jsme úspěšně nalezli 6 po sobě jdoucích číslic. Podbarveno již máme 8 znaků.
11 <xy123456zzz1> | 10: OPEN1 Dále byly nalezeny 3 znaky z a nakonec ještě znak 1. V okamžiku, kdy se regulární výraz dostane k uzlu END, skončí porovnání úspěchem.
Match successful!
ZávěrTímto jsme definitivně skončili rozsáhlou kapitolu o regulárních výrazech. Pokud máte zájem o další informační zdroje, zde některé uvádím:
Related article
Perl (1) - Dávka teorie na úvod Perl (2) - Úvod do syntaxe Perl (3) - Proměnné Perl (4) - Čísla a řetězce Perl (5) - Podmínky Perl (6) - Pravdivostní výrazy Perl (7) - Vstup poprvé Perl (8) - Některé základní vestavěné funkce Perl (9) - Cykly Perl (10) - Další řídící struktury Perl (11) - Pole - úvod Perl (12) - Pole - základní operace Perl (13) - Hashe Perl (14) - Další nástroje pro seznamy Perl (15) - Výchozí proměnná, heredoc, symbolické odkazy Perl (16) - Regulární výrazy - začínáme Perl (17) - Regulární výrazy - kotvy Perl (18) - Regulární výrazy - množiny znaků Perl (19) - Regulární výrazy - opakování a kvantifikátory Perl (20) - Regulární výrazy - magické závorky Perl (21) - Regulární výrazy - nahrazování Perl (22) - Regulární výrazy - přepínače Perl (23) - Regulární výrazy - rozšířené vzory Perl (24) - Regulární výrazy - příklady Perl (26) - Podprogramy Perl (27) - Prototypy Perl (28) - Rozsahy platnosti proměnných Perl (29) - Úvod k práci se soubory Perl (30) - Práce se soubory Perl (31) - Testování souborů Perl (32) - Jiné typy souborů Perl (33) - Formátování výstupu - printf Perl (34) - Formátování výstupu - formáty Perl (35) - Vestavěný debugger Perl (36) - Grafické debuggery Perl (37) - Začínáme s moduly Perl (38) - Rozhraní modulu Perl (39) - Pragma Perl (40) - Dodatky k modulům Perl (41) - CPAN Perl (42) - Argumenty příkazového řádku Perl (43) - Přepínače Perl (44) - Dlouhé přepínače Perl (45) - Odkazy Perl (46) - Užití odkazů a anonymní data Perl (47) - Složitější datové struktury Perl (48) - Libovolně složité datové struktury Perl (49) - Tabulky symbolů a typegloby Perl (50) - Uzávěry a iterátory Perl (51) - Signály Perl (52) - Externí příkazy Perl (53) - Režim nakažení Perl (54) - Fork Perl (55) - Eval Perl (56) - Volby příkazu perl Perl (57) - Jednořádkové skripty Perl (58) - OOP - úvod Perl (59) - OOP - typické použití Perl (60) - OOP - dědičnost Perl (61) - OOP - přínos a užití dědičnosti Perl (62) - OOP - přetěžování Perl (63) - OOP - závěr Perl (64) - Projekt - čtečka sportovních výsledků Perl (65) - Projekt - získání dat Perl (66) - Projekt - výběr zápasů a podrobnosti Perl (67) - Projekt - dokončujeme modul Perl (68) - Projekt - zobrazení zápasů Perl (69) - Projekt - online přenos Perl (70) - Plain Old Documentation Perl (71) - Navazování proměnných Perl (72) - Navazování složitějších datových typů Perl (73) - DBM Perl (74) - Sockety Perl (75) - Obsluha více klientů Perl (76) - Síťová hra v kostky Perl (77) - Služby internetu Perl (78) - Databáze - úvod Perl (79) - Databáze - manipulace s daty Perl (80) - Databáze - závěrečné poznámky Perl (81) - CGI - příprava webového serveru Perl (82) - CGI - první skripty Perl (83) - CGI - získávání dat od uživatele Perl (84) - CGI - usnadnění tvorby skriptů pomocí modulu CGI Perl (85) - CGI - generování dokumentu modulem CGI Perl (86) - CGI - cookies Perl (87) - CGI - příklad aplikace Perl (88) - CGI - závěr Perl (89) - Mason - snadné psaní webů Perl (90) - Mason - speciální bloky Perl (91) - Mason - handlery Perl (92) - Mason - závěr Perl (93) - Catalyst - MVC framework pro Perl Perl (94) - Catalyst - základy pro psaní aplikace Perl (95) - Catalyst - šablony Perl (96) - Catalyst - spolupráce s databází Perl (97) - Curses - tvorba textových uživatelských rozhraní Perl (98) - Curses - pozicování a okna Perl (99) - Curses - měření rychlosti psaní Perl (100) - Curses - použití hotových widgetů Perl (101) - Curses - jednoduchý textový editor Perl (102) - Rozšiřování Perlu pomocí XS Perl (103) - Rozšiřování Perlu pomocí SWIG Perl (104) - Testování rychlosti Perl (105) - Testování programových jednotek Perl (106) - Debugování pomocí komentářů Perl (107) - Moose - moderní objektový systém Perl (108) - Moose - základní vlastnosti Perl (109) - Moose - role Perl (110) - Moose - meta API Perl (111) - Pokročilá práce se seznamy Perl (112) - Práce s PDF Perl (113) - Práce s archivy Perl (114) - Tk - úvod Perl (115) - Tk - umísťování widgetů Perl (116) - Tk - základní widgety Perl (117) - Tk - některé pokročilejší widgety Perl (118) - Tk - čas a události Perl (119) - Tk - CD man Perl (120) - Wx - základní práce s widgety Perl (121) - Wx - události Perl (122) - Gtk2 - úvod Perl (123) - Gtk2 - základní práce s obrázky Perl (124) - Gtk2 - události a čas Perl (125) - Gtk2 - vlastní widgety Perl (126) - Gtk2 - textové okno a práce s pozicemi Perl (127) - Gtk2 - hierarchické seznamy Perl (128) - Gtk2 - dialogy Perl (129) - Gtk2 - skládání widgetů Perl (130) - Gtk2 - menu a toolbary Perl (131) - Gtk2 - transparentní okna, tray ikona, výběr souborů Perl (132) - Gtk2 - drag&drop, druid Perl (133) - Gtk2 - úpravy vzhledu aplikací pomocí rc Perl (134) - Gtk2 - Glade Interface Designer Perl (135) - XML - čtení a zápis Perl (136) - XML - DOM a SAX přístupy Perl (137) - Vlákna Perl (138) - Memoizace - cachování podprogramů Perl (139) - Profilling - efektivní odhalování pomalých míst v programu Perl (140) - Profilling - píšeme si vlastní profiler / debugger Perl (141) - Formátování kódu, deparsování, perltidy Perl (142) - Způsoby konfigurování Perl (143) - Struktura datových typů, správa paměti Perl (144) - POE - událostmi řízené programování Perl (145) - POE - aplikace typu klient-server Perl (146) - Perl 6 - jazyk budoucnosti Perl (147) - Perl 6 - regulární výrazy, nové operátory Perl (148) - Perl Culture Perl (149) - Závěr Pozvánka na Český Perl Workshop Perl 5.22.0 a vše okolo Perl 5.24.0 a vše okolo Previous Show category (serial) Next
|
Szukanie oprogramowania
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |