ARCHIV |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
Perl (46) - Užití odkazů a anonymní dataAnonymní data jsou nezbytná pro vytváření libovolně složitých datových struktur. Předávání seznamů podprogramůmPodprogramy v Perlu nejsou schopny sami rozlišit, co jim je předáváno. Vše se slije do pole @_ a sám programátor musí v podprogramu pole znovu rozdělit. Problém je v tom, že seznamy mají libovolný počet prvků. Nelze tak zjistit hranici mezi předanými seznamy. Existuje jediné (pomineme-li předání počtů prvků polí nebo jiné informace jako dalších argumentů) řešení - nepředávat seznam, ale pouze adresu, kde leží v paměti. Adresa je skalární hodnotou a tak netřeba hledat hranice mezi poli. Předávání datových struktur pomocí odkazů je také efektivnější - pole zůstává v paměti na svém místě a odpadá tak jeho kopírování. U větších datových objemů to může mít vliv. Ukažme si konkrétní ukázku podprogramu, který přijímá 2 pole. Napíšeme program na zjištění duplicitních hodnot z předaných polí.
my @pole1 = (1, 3, 5, 7); Podprogram přijímá jako argumenty 2 odkazy. Ty pak dereferencuje a pracuje s nimi jako s obyčejným polem. Stejný postup - předávání polí pomocí odkazů - lze v případě potřeby uplatnit i při vracení výsledků z procedury. Podprogram procedura vrací odkaz na pole. Jeho hodnoty vytiskneme následovně.
$odkaz_na_pole = procedura(...); Datový typ, na který odkaz odkazujeFunkce ref přijímá jako parametr skalární proměnnou. Pokud tato proměnná není odkazem, vrací ref nepravdivou hodnotu. V opačném případě vrací datový typ hodnoty, na kterou odkaz ukazuje. ref vrací vždy jednu z těchto hodnot:
Anonymní dataAnonymní data se používají pro vytváření složitých datových struktur, kde může jediná proměnná zpřístupňovat hluboce vnořená data. Vytváření anonymních dat je v podstatě vytváření dat, ke kterým nebudeme mít přístup přes obyčejnou proměnnou. Jinými slovy, nemáme-li k určitým datům přímý přístup, ale máme jejich adresu, jsou tato data anonymní. Přistupovat k nim lze jen přes odkaz a ne jinak. Tabulka ilustruje skalární anonymní hodnotu v paměti.
K hodnotě "HODNOTA" neexistuje příslušná proměnná. Existuje ale jiná proměnná, ve které je adresa této hodnoty. Pro jednoduchost jde v tabulce pouze o anonymní skalární data. Ty se ale prakticky nepoužívají. Mnohem větší význam mají anonymní pole, hashe a občas procedury. Anonymní poleNa úvod vytvoříme odkaz na pole.
@pole = (2, 3, 4); To je klasické pojmenované pole tak, jak ho známe. A teď zkusíme udělat to samé, ale záměrně opustíme rozsah platnosti proměnné @pole.
{ Za blokem již neplatí proměnná @pole. Přesto data zůstávají alokována, protože na ně stále ukazuje globální proměnná $r_pole a čítač odkazů je na hodnotě 1. K poli nyní nelze přistupovat přímo, ale pouze přes odkaz. Jinými slovy, pole se stalo anonymním. Tento postup je značně neohrabaný a pro tvoření rozsáhlých datových struktur ho použít nelze. Je na něm ale hezky vidět, co to anonymní data vlastně jsou. V praxi to funguje jinak. Perl umožňuje definovat pole od začátku již jako anonymní. Postup je stejný jako u definice klasického pole, jen se seznam hodnot píše místo kulatých do hranatých závorek.
$r_pole = [2, 3, 4];
Prefixem proměnné $r_pole je dolar, neboť je stále pouze odkazem. Anonymní hashAnalogicky lze vytvořit anonymní hashe. Tentokrát se používají složené závorky.
$r_hash = {"h1" => 2, "h2" => 3, "h3" => 4};
Nyní se jen pro zajímavost podívejme na tuto zajímavou situaci. Jak poznáme, kdy složené závorky označují blok a kdy jde o vytvoření odkazu na hash? Někdy to může kolidovat. Jako v tomto případě:
sub rret { { (2, 3, 4) } }
Teď je otázkou, zda budou vnitřní složené závorky brány jako blok nebo jako anonymní hash. Obojí bude z procedury vracet jinou hodnotu. Správně je v tomhle případě první možnost. Lepší je ale jednoznačně určit co je co:
sub rret { +{ (2, 3, 4) } }# + označuje, že jde o anonymní hash Anonymní konstantní skalárDalší možností odkazů je vytvořit odkaz na konstantní skalární hodnotu. Ta je po vytvoření přístupná pouze pro čtení. Značí se zpětným lomítkem před výrazem.
$r_a = \11; Všechny proměnné $$r_a, $$r_b a $$r_c jsou pouze pro čtení. Jestli se je pokusíte měnit, vyskočí na vás:
Modification of a read-only value attempted
Anonymní podprogramsub beze jména vrací odkaz na anonymní podprogram. Vyvolat ho lze předřazením znaku &.
$r_hello = sub { print "Hello world!\n"; }; Protože volání podprogramu je příkaz, píše se za ním středník.
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 (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 (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 (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 |