Stop thinking in terms of bitwise; this is Boolean. The "evaluated expressions" are logical values. 2 is logic-true, 3 is logic-true, 2 and 3 returns 3, which is logic-true. It uses the last evaluated expression as the logical value.
C:\usr\local\share\PassThru\perl>perl -le "print +('george' and 'graci
+e')"
gracie
C:\usr\local\share\PassThru\perl>perl -le "print +('0' and 'gracie')"
0
C:\usr\local\share\PassThru\perl>perl -le "print +('' and 'gracie')"
C:\usr\local\share\PassThru\perl>perl -le "print +('george' and 'false
+')"
false
C:\usr\local\share\PassThru\perl>perl -le "print +('george' and '')"
C:\usr\local\share\PassThru\perl>perl -le "print +(2 and 4)"
4
C:\usr\local\share\PassThru\perl>perl -le "print +(2 && 4)"
4
C:\usr\local\share\PassThru\perl>perl -le "print +(2 & 4)"
0
| [reply] [Watch: Dir/Any] [d/l] |
>> Stop thinking in terms of bitwise; this is Boolean.
If this is Boolean, shouldn't it return 1 or ''/0?
p.s. I haven't write anything about bitwise.
| [reply] [Watch: Dir/Any] |
If this is Boolean, shouldn't it return 1 or ''/0?
Technically, TRUE and FALSE. 1 and 0 are just one way of representing those concepts. The TI99-4/A TI-BASIC used -1 to represent TRUE. Perl uses just about anything for TRUE, and a more limited set (including 0, '', and undef) for FALSE; as a result, Perl just picked the most convenient TRUE or FALSE for implementing with the short-circuiting of and / or, which turned out to be the last expression evaluated -- because with short-circuiting, the last expression evaluated always has the same logical value as the entire and / or. With xor, neither the last-evaluated nor the first-evaluated expression contains the correct logical value, so Perl has to do extra work to come to the right logical conclusion, so then Perl uses its default TRUE and FALSE representations, rather than just picking the value from one of the evaluated expressions.
p.s. I haven't write anything about bitwise.
Sorry, you're right. I was going on very little sleep yesterday, and had misinterpreted your original post in a way that made me conclude you were expecting results similar to a bitwise operation; re-reading after a better night's sleep, I don't see that anymore.
| [reply] [Watch: Dir/Any] [d/l] [select] |
> I think that section needs to be slightly rewritten
I agree that && and || should be extended with the notion: "returns last evaluated side".
Probably with an analogous if statement.
A || B := do { if (A) {A} else {B} }
I disagree that they "do not return logical result" , because the truth table is fully respected.
I don't think the docs to and/or need to be extend, because their low precedence and use for flow control makes the use of return values unlikely without brackets. Mentioning the similarity to && and || should be sufficient.
| [reply] [Watch: Dir/Any] [d/l] [select] |