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 |