Kde je reference

Ondrej Koala Vacha koala na fi.muni.cz
Úterý Duben 10 19:55:23 MEST 2001


On Tue, 10 Apr 2001, Honza Pazdziora wrote:

> Vse se vyjasni, pokud nahoru date use strict (a nasledne my na ty
> promenne). Hlaska potom bude


use strict pouzivam, ale u tohoto zkusebnoho prikladu me nenapadlo,
jaky muze mit vyznam.

>
> Can't use string ("5") as a HASH ref while "strict refs" in use at - line 4.
>
> Potiz je v tom, ze autovivication (tedy vytvoreni anonymniho objektu
> a vraceni reference na nej) funguje pouze u nedefinovanych hodnot.
> Pokud je hodnota promenne jiz definovana (a neni to reference, nebo ma
> spatny typ), vezme se jako symbolicka reference. Cili zde se jako
> reference pouzije retezec '5'.
>
> Uri v http://tlc.perlarchive.com/articles/perl/ug0002.shtml rika:
>
> 	Autovivification of references only occurs when you
> 	dereference an undefined value. If there is a defined value
> 	(and not a reference of the proper type), it will be used as
> 	a symbolic reference and not be what you want. Remember,
> 	symbolic references are black magic and should only be used
> 	in very few cases and never by newbies. You should be using
> 	strict which disables symbolic references and would thereby
> 	detect the error of dereferencing a variable which has
> 	a value other than undef or a proper reference.
>
> Cili adresujete jine misto v pameti nez v pripade toho @y, a diky
> tomu je mozne, ze zaroven vidite tu skalarni hodnotu a zaroven hodnotu
> touto hodnotou symbolicky adresovanou.
>

je to opravdu hezka magie, kdyby si clovek rekl, ze je to normalni hodnota
a referenci si perl ulozil nekam jinam:

----------------  doplnime priklad ----------------
my (@x, na y, na z);

$y[2]{'v1'}=5;
$y[2]{'v2'}=6;

print $y[2],"\n";
print $y[2]{'v1'},"\n";
print $y[2]{'v2'},"\n";

$x[2]=5;
$x[2]{'v1'}=5;
$x[2]{'v2'}=6;

print $x[2],"\n";
print $x[2]{'v1'},"\n";
print $x[2]{'v2'},"\n";

$z[2]=5;           # tady vyvorime nove pole, ulozime cislo 5
$z[2]{'v1'}=15;
$z[2]{'v2'}=16;


print $x[2],"\n";
print $x[2]{'v1'},"\n";  # vytiskne 15
print $x[2]{'v2'},"\n";  # vytiskne 16


-------------------------------cut------------------------------------

uff. Diky moc za vyjasneni obzoru


s pozdravem
-- 
Ondrej Koala Vacha



Další informace o konferenci Perl