Perl: the Markov chain saw PerlMonks

### OEO, a zero that evaluates to true?

by coolmichael (Deacon)
 on Jan 08, 2002 at 13:10 UTC Need Help??
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).

Create A New User
Node Status?
node history
Node Type: perlquestion [id://137079]
Approved by root
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (3)
As of 2018-05-23 02:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
World peace can best be achieved by:

Results (166 votes). Check out past polls.

Notices?