in reply to Question about ternary condition

You're being bitten by precedence. Ternary ?: has a higher precedence than =, so what perl parses is:

Y:\tmp>perl -MO=Deparse,-p (my(%hash) = ('A', 'on', 'B', 'on', 'C', 'off', 'D', 'off', 'E', 'off' +)); foreach $_ (keys(%hash)) { my($result); (((exists($hash{$_}) && ($hash{$_} eq 'on')) ? ($result = 'OK') : +$result) = 'KO'); print($result, "\n"); } syntax OK

You're effectively doing ($result='OK')='KO' in the case of a match, hence your output. The solution is of course to use parentheses:

(exists $hash{$_} and $hash{$_} eq 'on') ? ($result = 'OK') : ($result = 'KO');

Nice gotcha you found there :)