ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
Perl (5) - PodmínkyUkážeme si jeden z prostředků, který je nezbytný v každém menším programu. Díky podmínkám se lze v jistém bodě vykonávání programu rozhodnout mezi různými větvemi, kudy se dál budeme ubírat. Podmínka rozhoduje, kudy se má skript vykonávat. Díky podmínkám nemusejí příkazy probíhat od prvního k poslednímu, ale lze části vynechávat. Podmínka tedy určuje, zda má být určitý příkaz nebo blok kódu (dále v článku) vykonán. Spojením několika podmínek pak získáváme různé programové větve, z nichž se provede pouze jedna. Uvedeme si na začátek příklad podmínky v našem jazyce, která by mohla názorněji osvětlit jejich smysl.
Zde je pochopení intuitivní. Cílem programu je zabezpečit, aby nehlasoval jeden člověk vícekrát. Proto si program nejdříve musí zkonrolovat, zda už stejný člověk nehlasoval. Pokud zjistí že ano, vypíše program Již jste hlasoval!. V opačném případě zobrazí hlasovací lístek. Tak funguje podmínka i v Perlu. Stačí se jen naučit, jak ji přeložit do jeho syntaxe. Blok příkazůJeště předtím ale vysvětleme pojem blok příkazů. Jeho význam tkví v seskupení několika příkazů tak, abychom s nimi mohli najednou pohodlně nakládat. Označuje se složenými závorkami a struktura vypadá takto:
Za posledním příkazem bloku je středník nepovinný (středník odděluje, nikoliv zakončuje příkazy), ale je dobré ho psát pro případ, že bychom ho někdy chtěli editovat. Za složenou koncovou závorku se středník nepíše. Blok je nyní pro nás skupina příkazů, které budou podmínkou (později poznáme jiné strukturované příkazy, pro které se blok také používá) vykonány. Bezprostředně za podmínkou (testem) jestliže (bylo hlasováno) v příkladu můžeme právě takový blok nalézt. Vše, co je mezi { a } bude vykonáno, byl-li test úspěšný. V opačném případě bude blok přeskočen a skript pokračuje za ním. Pravda (true) a nepravda (false)Z každého výrazu, to jest z každé hodnoty po průchodu libovolnou operací, získáme nějakou hodnotu novou. Tato výsledná hodnota může být dvou typů. Buď true nebo false. Podle typu hodnoty se pak vyhodnocuje například právě test podmínky. V našem příkladu jsme za klíčové slovo jestliže napsali do jednoduchých závorek test. Co to ale test je a jak je vyhodnocován? Již bylo naznačeno, jak tyto dvě informace souvisí. Je-li výsledek testu pravdivý (true), bude následující blok příkazů vykonán. Bude-li výsledkem false, bude naopak přeskočen. Jaká jsou pravidla pro určování, kterého typu je výraz (nebo-li hodnota nebo test)? Podmínka je false v případě, že je test (ještě jednou připomeňme, že to je prostě nějaký výraz) vyhodnocen jako:
Ve všech ostatních případech je test vyhodnocen jako true. Podmínka ifUž víme, kdy je test vyhodnocován jako true a kdy jako false. Poslední informací, kterou potřebujeme je, že podmínku zapisujeme slovem if. Nyní se můžeme podívat na několik příkladů podmínek.
Uložme si tento kód do souboru a zkusme spustit. Tam, kde jsou testy pravdivé, budou vytišteny příslušné zprávy. Podmínka s alternativou if...elseKonstrukce if...else se používá k vytváření podmínek s dvěma větvemi - if větev a else větev. Pokud je pomínka vyhodnocena jako false, automaticky se provede blok kódu, uvedený za else. Pokud je test true, vykoná se blok kódu za if a druhý blok se již nevykoná.
Tento kód bychom mohli ekvivalentně přepsat jen pomocí jednoduchých podmínek. Poznamenejme, že uvedení vykřičníku obrací typ hodnoty.
Z tohoto přepisu je vidět, co se stane, zkusíme-li změnit hodnotu testované proměnné na false. Podmínka if...n*elsif...(else)Fakticky ale můžeme do podmínky přidat libovolný počet větví. V takovém případě se prostřední větve uvádějí za slovo elsif. Jak probíhá vyhodnocování? Nejprve se testuje hodnota v testu za if. Není-li true (blok se nevykoná), vyhodnotí Perl test za prvním slovem elsif. Není-li ani ten úspěšný, vyhodnocuje Perl další větev elsif a takto pokračuje, dokud není některý test vyhodnocen jako true. Stane-li se tak, je následující blok vykonán a ostatní větve přeskočeny. Větví elsif můžete použít libovolné množství. A jestliže testy ve všech větvích dopadnou jako false, vykoná se blok za větví else (pokud je uvedená). Podívejme se opět na úsek kódu.
Pro úplnost ještě uveďme příklad s přítomnou větví else:
Podmínkový operátor ?...:Podmínkový operátor dělá totéž jako podmínková konstrukce. Hodí se na spíše u konstruování výrazů (než příkazy) a zejména u krátkých podmínek se tento zápis velmi často používá. Je to často kvůli přehlednosti výhodnější než podmínková konstrukce a lze pomocí něj simulovat i celou konstrukci if...n*elsif...(else). Obecný zápis vypadá takto:
Pro srovnání, if funguje takto:
Lze konstruovat i více podmínkových větví, což se nezřídka používá.
Uveďme dva konkrétní příklady, které dělají totéž. První není příliš vhodně napsaný, protože pro podmiňování příkazů působí podmínkový operátor dost neohrabaně. Zato v tom druhém tiskneme návratovou hodnotu operátoru, což se obvykle očekává.
Protože 1 je true, vytiskne se TRUE. Teď ještě ukažme něco méně samoúčelného. Sice zatím neznáme klíčové slovo return, avšak často se tento operátor využívá právě tam.
Podmínka unless...(n*elsif)...(else)Mimo výše zmiňovaných existuje podmínka s opačným významem než má if a příkazy s podmínkou na konci. Na začátku řekněme, že většinou nebývá dobrým nápadem tyto konstrukce používat, protože často zbytečně znečitelňují program. Zbytek článku klidně přeskočte. Obzvlášť pro začínající je možná lepší, když tyto konstrukce znát nebudou. Podmínka unless je negované if. Česky se dá if vyjádřit slovem jestliže, unless slovy jestliže ne. Kód ve větvi unless se provede, vyhodnotí-li se test jako false. unless vzniklo jako zjednodušení pro if, kdy testujeme nějaký negovaný výraz. V těle unless lze použít jak elsif, tak else. Použití elsif může být poněkud matoucí. unless totiž provede blok, je-li test false, a elsif ho provede, je-li test true. Podívejme se na příklad použití unless, který se ovšem dá jednoduše převést na konstrukci if...else):
Na závěr ještě jednou varujme před používáním unless. V naprosté většině případů je použití matoucí a je lepší dát přednost klasickému if. Podmínka za příkazemSyntakticky je správně též prohození bloku příkazů a podmínky. Následující kód bude fungovat.
I na tomto místě je třeba důrazně upozornit, že nebývá vhodné umístit podmínku za příkaz. Tento typ podmínky se používá výlučně pro příkazy typu last, next, redo a občas return. V jakémkoliv jiném případě je mnohem lepší použít klasické podmínky. Podmínka za blokemStejné jako podmínka za příkazem až na to, že se místo jednoho příkazu vykoná celý blok. Před blok musíme uvést klíčové slovo do. Lze použít jak konstrukci do...if, tak i do...unless.
Za testem musí být středník. To proto, že za ním už není blok, ale následují další příkazy. I tento odstavec je pouze informativní a z důvodu přehlednosti bychom neměli takové konstrukce používat, i když je to možné. Podmínka case a switchJednou z mála běžných konstrukcí, které Perl standardně nenabízí je case, která testuje týž výraz na různé hodnoty. Lze ji ale napsat řadou způsobů pomocí operátorů. Operátorové konstrukce se dají často použít ve speciálních případech místo konstrukce if...mnoho*elsif...(else), která nebývá příliš šťastným řešením.
Platí-li pravdivostní výraz na začátku řádku, vykoná se blok za klíčovým slovem do a dál program pokračuje za blokem označeným CASE. Využíváme zde triku s operátorem and, který nevyhodnocuje druhý operand, pokud již po vyhodnocení prvního je jasné, že výsledkem bude false. Značení bloků a klíčové slovo last probereme až v některém z dalších dílů. Ani předchozí postup však není zrovna nejpohodlnější. Dalším a nejjednodušším způsobem zavedení této funkcionality je proto použití pragmy feature.
Po uvedení takového příkazu získáme novou konstrukci given...when. Stačí nám tak napsat následující.
Související články
Předchozí Celou kategorii (seriál) Další
Perl (1) - Dávka teorie na úvod
Perl (2) - Úvod do syntaxe Perl (3) - Proměnné Perl (4) - Čísla a řetězce 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 (25) - Regulární výrazy - závěr 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 Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |