|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
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.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |