Prirazeni v seznamovem kontextu
David Olszyński
hisaak na mrkvoslav.ascs.muni.cz
Pondělí Duben 22 12:26:28 MEST 2002
Dobry den.
Pred nedavnem jsem si na http://www.linuxzone.cz/index.phtml?ids=2&idc=183
precetl, ze prikazy
@pole = (1, 2);
@pole[0,1] = @pole[1,0];
povedou k tomu, ze v $pole[0] i $pole[1] bude hodnota 2. Zduvodneni bylo
takove, ze prirazeni se provede _postupne_ tedy vlastne takto:
$pole[0] = $pole[1];
$pole[1] = $pole[0];
Pripadalo mi to jako hloupost a jednoduchy test mi to samozrejme potvrdil.
Nedalo mi to, a tak jsem o chybe napsal autorovi clanku. Odpovedel mi, ze
se pletu a ze si to mam vyzkouset. ;-)
Samozrejme jsem to zkousel uz predtim (verze 5.6.0 na Linuxu a 5.004_04 na
IRIXu), takze jsme se trosku nepohodli. Vysledkem je, ze autor stale trva
na tom, ze u nej (pry ve stejnych verzi) je vysledek takovy, jak psal ve
clanku. Je to vubec mozne? Pripadne mi to dost nepravdepodobne, protoze pri
prirazeni se prece musi nejprve vyhodnotit _cela_ prava strana a az pak se
hodnoty "prenesou" nalevo.
Napriklad v pripade
@pole = (1, 2);
@pole[0,1] = @pole[1,funkce($pole[0])];
by muselo dochazet k dost neocekavanemu chovani. Jeste podivnejsi by to
muselo byt ve chvili, kdy by se provedla jen pulka prirazeni a doslo by
treba k volani obsluhy signalu (nebo v budoucnu k vyjimce). Prece se nemuze
provest jen polovina prikazu!
Opravdu by me zajimalo, jestli je tohle mozne. Docela me to zmatlo.
Mimochodem je docela zajimave, ze i manova stranka perldata se v tomto
ohledu plete :-). Je v ni napsano, ze prikazy
@folks[0, -1] = @folks[-1, 0];
a
($folks[0], $folks[-1]) = ($folks[0], $folks[-1]);
delaji totez, coz zjevne neplati (asi preklep).
hisaak
Další informace o konferenci Perl