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