http://www.perlmonks.org?node_id=137079

coolmichael has asked for the wisdom of the Perl Monks concerning the following question:

I noticed this a while ago, but didn't really think that much of it at the time. The value, "0E0" evaluates numerically as zero, but is also true. Is this an example of "deep magick" in Perl? I got caught up on this while using the dbi to run some queries. It seems like the whole point (from the docs) was to create a numerical zero, which evaluates to true, so that you can return true (as in a query was successful, didn't cause any errors) but doesn't return any results.

Can anyone confirm or deny this?

on a slightly related note, does anyone know why 0E0 + 1 doesn't stay in scientific notation? It seems counter intuitive to me, but my intuition has been doing funny things lately.

#!perl -w use strict; my $oero = "0E0"; my $zero = "0"; print "oero ($oero) true\n" if($oero); print "oero ($oero) defined\n" if(defined($oero)); print "zero ($zero) true\n" if($zero); print "zero ($zero) defined\n" if(defined($zero)); print "zero eq oero\n" if ($oero eq $zero); print "zero == oero\n" if ($oero == $zero); print "oero+1: ", $oero+1, "\n"; print "oero+zero: ", $oero+$zero, "\n"; print "oero+oero: ", $oero-$oero, "\n"; OUTPUT: oero (0E0) true oero (0E0) defined zero (0) defined zero == oero oero+1: 1 oero+zero: 0 oero+oero: 0

Replies are listed 'Best First'.
Re: OEO, a zero that evaluates to true?
by blakem (Monsignor) on Jan 08, 2002 at 13:23 UTC
Re: OEO, a zero that evaluates to true?
by particle (Vicar) on Jan 08, 2002 at 18:17 UTC
    there's an error in the last line of your code:

    print "oero+oero: ", $oero-$oero, "\n";

    although you're printing "oero+oero, you're calculating $oero-$oero, which is not the same, because if $oero was any number, subtracting itself would probably yield 0. instead, it should read

    print "oero+oero: ", $oero+$oero, "\n";

    which fortunately, evaluates as 0, and stands as a good example of 0 but true.

    ~Particle

Re: OEO, a zero that evaluates to true?
by princepawn (Parson) on Jan 08, 2002 at 13:51 UTC
    I'm surprised that "0" is false...

    I added in checks for floating point zero as well...

    #!perl -w use strict; my $oero = "0E0"; my $zero = "0"; my $foat = 0.0; print "oero ($oero) true\n" if($oero); print "oero ($oero) defined\n" if(defined($oero)); print "zero ($zero) true\n" if($zero); print "zero ($zero) defined\n" if(defined($zero)); print "foat ($zero) true\n" if($foat); print "foat ($zero) defined\n" if(defined($foat)); print "zero eq oero\n" if ($oero eq $zero); print "zero == oero\n" if ($oero == $zero); print "oero+1: ", $oero+1, "\n"; print "oero+zero: ", $oero+$zero, "\n"; print "oero+oero: ", $oero-$oero, "\n";
Re: OEO, a zero that evaluates to true?
by n3dst4 (Scribe) on Jan 08, 2002 at 21:40 UTC
    Blakem pointed you to a good resource, but basically you've hit Context. In Perl, when you:
    Do a mathsy thing to a string (like '0E0' or 'oink' or '57Fred')
    Any digits at the start are taken as the value and the rest is lost. So (5 + '0E0') == (5 + '0') == (5 + 0) == 5
    Do a stringy thing to a string
    It stays the way it is
    Do a neutral thing to a string, like checking for truth
    It again gets left the way it is.
    So in your case, '0E0' is true as a string, because it's neither empty nor just the string '0', but false as a number because it gets whittled down to the value 0 (the digits at the start).