Carl Mäsak wrote:
> Do not combine 'ne' and '|', like this:
>
> die "Unrecognized directive: TMPL_$directive"
> if $directive ne 'VAR' | 'LOOP' | 'IF';
> One is tempted to assume that this means the same as "$directive ne
> 'VAR' || $directive ne 'LOOP' || $directive ne 'IF"", but it doesn't.
> Instead, it's a negated string comparison against three values, the
> results of which are then OR-ed together. The condition will always be
> true, because there's always at least two values that $directive is
> not string-equal to.
$directive ne 'VAR' || $directive ne 'LOOP' || $directive ne 'IF'
is always true. For example assuming $directive = "cat";
"cat" ne 'VAR' (true) || "cat" ne 'LOOP' (true) || "cat" ne 'IF' (true)
or assuming $directive = "VAR"; Then:
"VAR" ne 'VAR" (false) || "VAR" ne 'LOOP' (true) || "VAR" ne 'IF' (true)
which is clearly not what you wanted. This works if you write instead:
$directive ne 'VAR' && $directive ne 'LOOP' && $directive ne 'IF'
"VAR" ne 'VAR" (false) && "VAR" ne 'LOOP' (true) && "VAR" ne 'IF' (true)
Result: false. (if it is not one of these things.... then....)
Of course now I'm confused as to what: $directive ne 'VAR' | 'LOOP' | 'IF'
does. If it was equivalent to:
not ($directive eq 'VAR' || $directive eq 'LOOP' || $directive eq 'IF')
then it would be doing the right thing. So since it isn't doing the right
thing, I can only assume that your statement above is in error and that:
$directive ne 'VAR' | 'LOOP' | 'IF'
IS INDEED the same as:
$directive ne 'VAR' || $directive ne 'LOOP' || $directive ne 'IF'
and that your expectation of the code is wrong.
> The "correct" form using junctions would be this:
>
> die "Unrecognized directive: TMPL_$directive"
> if $directive ne 'VAR' & 'LOOP' & 'IF';
which makes sense, because this does give us:
$directive ne 'VAR' && $directive ne 'LOOP' && $directive ne 'IF'
and that is provably correct.
> The more general advice, then, would be not to use junctions together
> with negated equality operators. Instead, use the non-negated equality
> operator, and negate the whole expression.
This is probably a good idea regardless,
J
--
("`-''-/").___..--''"`-._ | Jacinta Richardson |
`6_ 6 ) `-. ( ).`-.__.`) | Perl Training Australia |
(_Y_.)' ._ ) `._ `. ``-..-' | +61 3 9354 6001 |
_..`--'_..-_/ /--'_.' ,' | [EMAIL PROTECTED] |
(il),-'' (li),' ((!.-' | www.perltraining.com.au |