|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Adresa | Hodnota | Proměnná |
| 3 | ||
| 4 | ||
| 5 | "HODNOTA" | $x |
| 6 | ||
| 7 | ||
| 8 | ||
| 9 | ||
| 10 | ||
| 11 |
A teď vytvoříme na onu proměnnou odkaz. To se dělá stejně jako přiřazení proměnné, jen se před přiřazovanou hodnotu zapíše zpětné lomítko.
$ref_x = \$x;
$ref_x je skalární proměnná typu odkaz. Situace v paměti se změnila.
| Adresa | Hodnota | Proměnná |
| 3 | ||
| 4 | ||
| 5 | "HODNOTA" | $x |
| 6 | ||
| 7 | ||
| 8 | ||
| 9 | ||
| 10 | SCALAR(5) | $ref_x |
| 11 |
Popišme si, co údaje v tabulce znamenají. Na adrese 10 je uložena hodnota proměnné $ref_x. Tou je odkaz na jinou adresu - konkrétně na adresu 5, na které leží hodnota typu SCALAR s obsahem "HODNOTA". Lze tedy říci, že $ref_x ukazuje na adresu 5, kde je uložena hodnota "HODNOTA".
Nyní můžeme k hodnotě na adrese 5 přistupovat dvěma způsoby. Tak jako dosud, pomocí $x, nebo nově i přes odkaz $ref_x (jediné místo v paměti má 2 jména). Přístupu k hodnotě přes odkaz se říká dereferencování a uskutečňuje se uvedením dolaru mezi stávající dolar a identifikátor. Hodnotu na adrese 5 tedy můžeme tisknout jedním z těchto dvou příkazů, podle dané situace.
print $$ref_x;
print $x;
Perl si počet pevných odkazů, které ukazují na určité místo v paměti, počítá. Počet odkazů se dokáže nejen zvyšovat (vytvářením odkazů na dané místo v paměti), ale i snižovat (zánik nebo přepsání proměnných). Pokud takto klesne na 0, ztrácí se informace o umístění hodnoty. V takovém případě je hodnota zrušena pomocí automatického mechanizmu (tzv. garbage collection) a paměť se uvolní.
Stejný systém správy funguje v souborovém systému, kde je počet odkazů pro každý i-uzel také udržován. Počet odkazů je jednou z informací získaných příkazem ls -l.
Spiše jako zajímavost si uveďme, že za jistých okolností může nastat situace, kdy proměnná $x ukazuje na proměnnou $y a zároveň $y ukazuje na $x. Tomu se říká cyklický odkaz. Po skončení platnosti obou proměnných nemůže být místo v paměti uvolněno, protože čítač odkazů stále neklesl na 0. Pokud to nastane, nezpůsobí to prakticky žádné problémy. Ty nastávají až tehdy, když se tento efekt kumuluje. Zkuste si tento příklad (ale ještě předtím si vše rozdělané uložte) a sledujte paměťové zatížení například pomocí nástroje top.
while(1){
my($x, $y);
$x = \$y;
$y = \$x;
}
Podobně se pracuje s odkazy na pole. Při práci s polem jako s celkem se syntaxe liší pouze nezbytným nahrazením úvodního dolaru za zavináč.
@pole = (5, 6, 7, 8);
$r_pole = \@pole;
print @$r_pole; #tiskne 5678
Zajímavější je to s prvky polí. Z jediného odkazu získáváme přístup k celému poli. Pouze přidáme na konec zápisu dereferencovaného odkazu index. Prvek s indexem 2 se tiskne takto.
print $$r_pole[2]; #tiskne 7
Takový zápis může být značně nejasný. Na první pohled (a často ani na druhý) není zřejmé, kde provádění začíná. Vyhodnotí se nejdříve $$r_pole nebo $r_pole[2]? Lze pouze konstatovat, že správně je $$r_pole. Dereference má vždy vyšší prioritu než index v [].
Z tohoto důvodu se zavádí ještě další a na pohled jednoznačná syntaxe. Mezi název proměnné a index nebo klíč se vloží šipka. Tyto zápisy přístupu k prvku pole jsou stejné.
print $$r_pole[0];
print $r_pole->[0];
Pro hashe platí stejný postup jako při práci s polem. Platí to jak při práci s hashem jako celkem, tak s jednotlivými prvky.
%hash = ("a" => 1); #vytvoření hashe
$r_hash = \%hash; #vytvoření odkazu na hash
print $$r_hash{"a"}; #přístup k prvku přes odkaz na hash
print $r_hash->{"a"};#to samé s použitím šipkové notace
Nejen na typy skalár, pole a hash jde vytvořit odkaz. Důkazem toho je možnost odkazu na podprogram. Ačkoliv je tento typ odkazu možná hůře představitelný, systém je úplně stejný, jako v předchozích příkladech. Adresu získáme pomocí operátoru zpětného lomítka, tu přiřadíme do proměnné a pomocí ní můžeme po dereferenci volat podprogram.
sub tisk { print "Podprogram\n"; }
$r_print = \&tisk;
&$r_print();
&tisk();
Poslední 2 příkazy volaly tutéž proceduru. Podprogram tisk má nyní 2 jména.
Lze samozřejmě použít šipkovou notaci a případně i předat argumenty.
$r_code = \&delej_neco;
$r_code->(1, 2, 3)
Ale pozor - za jméno dereferencovávaného podprogramu se nesmí uvést závorky. V takovém případě by se podprogram provedl dříve, než se vytvořil odkaz. Do proměnné by se tak přiřadil odkaz na návratovou hodnotu podprogramu.
Doteď jsme data jen získávali. Pokud chceme data, na které odkazy ukazují, upravovat, musíme si uvědomit, co se děje v paměti. Přestavme si, že máme proměnnou $x a odkaz $r_x. Ten ukazuje na hodnotu proměnné $x.
$x = "HODNOTA";
$r_x = \$x;
Zápis na místo, kam ukazuje odkaz, provedeme, stejně jako při čtení hodnoty, dereferencí.
$$r_x = "JINA HODNOTA";
A teď vypišme hodnoty, na které ukazují $$r_x a $x.
print $$r_x;#tiskne "JINA HODNOTA"
print $x; #tiskne "JINA HODNOTA"
Přestože jsme upravili pouze $$r_x, novou hodnotu má i proměnná $x. Vysvětlení nabízí reprezentace v paměti. Obě proměnné ukazují na stejnou adresu paměti. Změnou hodnoty na této adrese se tedy změní všechny hodnoty získané dereferencováním proměnných, které na toto místo ukazují. Přesněji řečeno jedna hodnota, protože $$r_x je vlastně jen aliasem pro $x.
Pokud je zapsána proměnná tak, jako by byla pevným odkazem, ale pevným odkazem není, jde o symbolický odkaz. Máme-li proměnnou $$prom v případě pevných odkazů, samotné $prom obsahuje adresu v paměti. Symbolické odkazy se liší tím, že $prom není odkazem a místo toho obsahuje řetězec. Symbolické odkazy nejsou v pravém smyslu odkazy.
$delka = 186;
$prom = "delka";
print $$prom;
Hodnota proměnné $prom se stává jménem jiné proměnné. $delka a $$prom jsou aliasy, takže bylo vytisknuto 186.
Úplně stejně to funguje pro jiné datové typy.
@xx = (2, 3, 6);
$prom = "xx";
print @$prom[0];
Symbolické odkazy nelze v režimu strict (přesněji strict "refs") používat.
|
Příspívat do diskuze mohou pouze registrovaní uživatelé. | |
24.5.2013 6:42 /MaReK Olšavský
V rodině Arduina je nový přírůstek, Arduino Yún („Yún“ je čínsky „mrak“). Nové Arduino je nejen první s GNU/Linuxem, ale nabízí i WiFi konektivitu.
Přidat komentář
24.5.2013 6:42 /MaReK Olšavský
Na stránkách OMG! Ubuntu! vyšel krátký rozhovor s Markem Shuttleworthem. Tématy jsou Mir, Unity 8, budoucnost Ubuntu Touch, ale neunikl ani otázce na Windows 8.
Přidat komentář
23.5.2013 6:20 /MaReK Olšavský
Lektoři, kteří používají e-learning, se již nejspíše setkali s platformou Moodle, jejíž vývojáři vydali verzi 2.5 populární platformy. Vedle několika stovek drobných vylepšení přibyly i novinky v mobilním přístupu, podpora twitterovského Bootstrapu pro témata, nebo instalace pluginů přes administrátorskou část webového rozhraní.
Přidat komentář
23.5.2013 6:20 /MaReK Olšavský
Nová distribuce Pidora by měla zajímat Fedoristy, kteří mají Raspberry-Pi, jelikož je optimalizovaným spinem právě pro tuto platformu. Novinky Pidory shrnul Rick Lehrbaum .
Přidat komentář
23.5.2013 6:20 /MaReK Olšavský
Krátce po vydání Debianu 7 vyšel i Debian GNU/Hurd 2013. Jádro GNU/Hurd se vyvíjí delší dobu, než Linux, ale zatím je spíše zajímavostí, protože jádro Linux se etablovalo u velkých společností a změna kurzu je více než nepravděpodobná.
Přidat komentář
22.5.2013 6:46 /MaReK Olšavský
Svobodný software ve státní sféře nejsou jen vítězství, ale i mýty a pověry, které jej vylučují z výběru. 5 nejčastějších hloupostí o F/L/OSS zkritizoval Adam Firestone na stránkách OpenSource.com. Nesetkáváme se s podobnými argumenty i při snaze prosadit svobodný software ve firmách a u soukromých osob?
Přidat komentář
22.5.2013 6:46 /MaReK Olšavský
Embedovatelná databáze SQLite byla vydána ve verzi 3.7.17, která nabízí větší rychlost (v některých úlohách až dvojnásobnou), opravy několika chyb, nebo vylepšení možností nahrávání rozšíření. O SQLite se píše výrazně méně, než o konkurenci, ale velmi pravděpodobně jde o nejčastěji nasazené řešení, díky mnoha aplikacím.
Přidat komentář
22.5.2013 6:45 /MaReK Olšavský
14. května 2013 IBM oznámila konec vývoje Lotus SmartSuite , Lotus Organizer a Lotus 1-2-3, balíků aplikací, jež byly považovány za špičku v oboru. Krátký nekrolog za legendární Lotus 1-2-3, který byl vyvíjen 30 let, sepsal Steven J. Vaughan-Nichols.
Přidat komentář
18.5.2013 17:55 /
Martin Kumst
Re: zaheslování bash scriptu nebo složky
18.5.2013 7:44 /
---
Re: Prosím o pomoc či radu
15.5.2013 19:21 /
Filip Vaněček
Cesty k souborům při používání coolurl
13.5.2013 6:50 /
Radim Kolář
Zabbix
8.5.2013 6:07 /
MaReK Olšavský
Web Upd8