# SPUG: "Boolean" return values

Michael R. Wolf MichaelRWolf at att.net
Tue Oct 14 00:21:15 PDT 2008

Colin Meyer wrote:
> On Mon, Oct 13, 2008 at 03:03:26PM -0700, Michael R. Wolf wrote:
>> Does anyone know the motivation for the return values from the boolean
>> operators?
>
> We have boolean context, but not boolean operators. Maybe "!". Most of
> the logical operators have return values based on their input.
>
>> true  returns (numeric) 1
>> false returns (string)  ''
>>
>> Why not just 0 and 1?  Why the mix of numeric and string?
>
> They return a multi-valued scalar:
>
>     > perl -MDevel::Peek -le'Dump( ! "" ); Dump( ! 0 );'
>     SV = PVNV(0x605060) at 0x2af2764040d0
>       REFCNT = 2147483647
>       IV = 1
>       NV = 1
>       PV = 0x606030 "1"\0
>       CUR = 1
>       LEN = 8
>     SV = PVNV(0x605060) at 0x2af2764040d0
>       REFCNT = 2147483647
>       IV = 1
>       NV = 1
>       PV = 0x606030 "1"\0
>       CUR = 1
>       LEN = 8
>
> In a string context, that will be "1"; Integer or real: 1; Boolean: true;

Thanks for the reply.  It helped me reformulate my question (even if I
don't understand all nuances of the underlying C code as reported by
Devel::Peek).

Boolean (err, 'logical') operator return values, Take 2:

The 6 relational operators (both the stringy and numy flavors), and
various other logical operators seem to return reasonable values in the
IV and NV slots (specifically 1 for "true" and 0 for "false").  I don't
understand why the PV slot is "1" for true and "" for false.  Why not
"1" and "0" so that the stringy value corresponds to the numy value?

It's especially confusing to folks (me included) who write code like this:

\$true = 1 < 100;
\$false = 100 < 1;

print "true is '\$true' and false is '\$false'\n";

It seems non-parallel, or imbalanced.  Can you reframe it for me in a
way that makes sense, creates balance, and seems consistent (for some
definition of consistent)?

To wit....

use Devel::Peek;

# Here's what "true" looks like...
Dump(! "");
Dump(! 0);
Dump(1 < 100);

# Here's what "false" looks like...
Dump(!! "");
Dump(!! 0);
Dump(100 < 1);

SV = PVNV(0x10022820) at 0x10012a08
REFCNT = 2147483644
IV = 1
NV = 1
PV = 0x10022008 "1"\0
CUR = 1
LEN = 4
SV = PVNV(0x10022c40) at 0x1004fbc0
REFCNT = 1
IV = 1
NV = 1
PV = 0x100220f8 "1"\0
CUR = 1
LEN = 4
SV = PVNV(0x10022c70) at 0x1004fcc8
REFCNT = 1
IV = 1
NV = 1
PV = 0x10022218 "1"\0
CUR = 1
LEN = 4
SV = PVNV(0x10022808) at 0x100129f0
REFCNT = 2147483645
IV = 0
NV = 0
PV = 0x10022004 ""\0
CUR = 0
LEN = 4
SV = PVNV(0x10022c88) at 0x1004fc08
REFCNT = 1
IV = 0
NV = 0
PV = 0x1002221c ""\0
CUR = 0
LEN = 4
SV = PVNV(0x10022ca0) at 0x1004fb48
REFCNT = 1