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