PERL, problem s hodnotou promenne

d.petr d.petr na post.cz
Pátek Říjen 9 19:26:23 CEST 2015



---------- Původní zpráva ----------
Od: d.petr <d.petr na post.cz>
Komu: Diskuse o Linuxu v cestine <linux na linux.cz>
Datum: 9. 10. 2015 12:04:22
Předmět: PERL, problem s hodnotou promenne

"Dobrý den,
řeším tady takový pro mě nepochopitelný problém v PERLu. Mám takovýhle 
kousek programu v konstrukci given-when

when ($_ < (nejaky_vyraz)) {
$Nova = $Sdilene{CO} - 0.2 * $Sdilene{PV};
if ($Sdilene{SL} > $Nova) {
$Sdilene{SL} = $Nova;
$Stav = 2;}}

a pokud program touto částí projde, vrátí se mi vždy $Sdilene{SL}==1 (má 
hodnotu 1). Přitom $Nova má hodnotu větší, než 1.
Zajímavé je, že když jsem si dovnitř bloku when zařadil různé průběžné 
výpisy proměnných, abych sledoval, kde se to pokazí, všechny proměnné 
nabývaly hodnot správných, dokonce i ta $Sdilene{SL}.
Teď jsem zjistil, že stačí změnit řádek uvnitř podmínky na
$Sdilene{SL} = 1 * $Nova;
a už je taky výsledek v $Sdilene{SL} správný. Zkrátka když jakkoliv 
použiju proměnnou $Nova před přiřazením její hodnoty do $Sdilene{SL}, 
vykoná se to celé dobře. Když přiřadím hned, vloží se 1. Přitom všechny 
použité proměnné jsou číselné.

Máte pro toto chování někdo vysvětlení? PERL 5.14.2.
"
 


Tak jsem se posunul trošku dál. Teď mám už za blokem given-when (takže ten 
už za to nemůže) proměnnou $Sdilene{SL} se správnou hodnotou, ale uloženou 
jako řetězec, tedy aspoň tak ji zobrazuje dumper. Je zvláštní, že

print "$Sdilene{SL} \n";

vypíše 1 (jedničku). Když ale před printem přiřadím

$Sdilene{SL} = $Sdilene{SL} * 1;

už print vypíše správnou hodnotu.

Fakt zvláštní.




Ani nečekám, že by ještě někoho něco napadlo, píšu to spíš už jen jako 
zajímavost.


Petr



Další informace o konferenci Linux