On Thu, Mar 14, 2002 at 10:32:56AM -0800, bob ackerman wrote:
> confusion i have with comma operator.
> docs seem to indicate it evaluates both sides, but i see examples where it 
> looks like if it evaluates to false on LHS it doesn't evaluate RHS. i see 
> this in examples of writing a case statement.
> $x='b';
> {
> ($x eq 'a') && (print 'a'), last;
> print 'x';
> }

> i see it work sortof sometimes - if $x isn't equal 'a', 'last' isn't 
> evaulated and it prints 'x'.
> shouldn't it also evaluate 'last', whether the LHS of that line is true or 
> not?

I'm not sure why you're seeing this result.  last is always evaluated here:

Given $x = "a", you should see just an "a" printed.  Given $x = "b" you
should see nothing printed.  Are you certain you didn't introduce an error? 
If you have a version of code that's printing the 'x' please paste it, along
with your usage of it to show it's printing the 'x'.

The expression "($x eq 'a') && (print 'a'), last" is equivalent to "(($x eq
'a') && (print 'a')), last".  The last is evaluated regardless of of the
truth of the test.  The expression (as you point out in a later email) "($x
eq 'a') and (print 'a'), last" is equivalent to "($x eq 'a') and ((print
'a', last)" because of the precedence of the and operator; the comma, and
the last, are only reached if the test is true.

It might help if you used the Deparse module like so:

    perl -MO=Deparse -wle '$x = "b"; { ($x eq "a") and (print "a"), last; print "x"; }'

Notice that this has nothing to do with how the comma evaluates its
arguments, but when the branch with the comma in it is reached.


Michael
--
Administrator                      www.shoebox.net
Programmer, System Administrator   www.gallanttech.com
--

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to