PERL, problem s hodnotou promenne

d.petr d.petr na post.cz
Pátek Říjen 9 14:37:07 CEST 2015


Pavel Kankovsky wrote:
> On Fri, 9 Oct 2015, d.petr wrote:
>
>> řeším tady takový pro mě nepochopitelný problém v PERLu. Mám takovýhle
>> kousek programu v konstrukci given-when
>>
>> when ($_ < (nejaky_vyraz)) {
>
> Takové konstrukce v Perlu za mých mladých časů nebývaly, tak s tím nemám
> zkušenosti, ale neměla by ve when být hodnota (vůči které je testován
> výraz v given) a ne podmínka?

	Pevná hodnota je asi nejpoužívanější případ, ale jak jsem to pochopil 
já, může tam být i porovnání a dokonce podmínka, která s výrazem v given 
vůbec nesouvisí. Myslím, že jsem už použil given(1) a ve when zcela 
různé podmínky a fungovalo to; napsal jsem to tak proto, že se použije 
první vyhovující podmínka a příslušný blok se vykoná, následující 
podmínky už se netestují, takže se tak lze vyhnout řetězům 
if-elsif-elsif-...


>> 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.
>
> Zajímavé je, že stejný efekt nemá použití v podmínce v příkazu
> if ($Sdilene{SL} > $Nova).
>
> To pozorované chování by mohlo svědčit o nějakých problémech s typem
> hodnoty v $Nova. Ale bylo by to divné, protože ta hodnota je o dva řádky
> nad tím vypočtena aritmetickým výrazem.
>
> Zkuste trochu prověřit hodnoty $Sdilene{CO} a $Sdilene{PV}, které
> vstupují do výpočtu $Nova, jestli nějaké magické chování nevykazují už ony.

	Typ v $Nova jsem také podezíral, ale jak už jsem psal, stačilo před 
přiřazení vložit
print "$Sdilene{SL} $Nova \n";
a vše se tvářilo správně a i výsledek pak už byl správně.
	$Sdilene{CO} a $Sdilene{PV} jsou snad v pořádku, používají se i jinde v 
programu a nezdá se, že by s nimi byly potíže.

	Dá se nějak zjistit, jestli je v proměnné číslo, nebo znakový zápis 
čísla (tzn. jestli je tam třeba 5 jako $Prom=5, nebo 5 jako $Prom='5')? 
V PERLu moc neprogramuji, tak nevím. Myslel jsem, že jedině jako 
výsledek porovnání == a eq, ale ukázalo se, že porovnání to nerozliší. A 
rozlišuje to vůbec PERL alespoň nějak vnitřně?

Petr


Další informace o konferenci Linux