Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Re: Re: A C-like brain in a Perl-like world

by CheeseLord (Deacon)
on Sep 27, 2001 at 05:08 UTC ( [id://114970]=note: print w/replies, xml ) Need Help??


in reply to Re: A C-like brain in a Perl-like world
in thread A C-like brain in a Perl-like world

In perl everything is true except for:

0 (including the string equvalents "0" "0.0" etc which all evaluate to zero)

Sorry, tachyon, but that's not quite right. "0.0" is not false in perl:

% perl -le 'print "" ? "True" : "False"' False % perl -le 'print "0" ? "True" : "False"' False % perl -le 'print "0.0" ? "True" : "False"' True

Now with new grammatical goodness! (Thanks, blakem. ;-)

His Royal Cheeziness

Replies are listed 'Best First'.
Re: Re: Re: A C-like brain in a Perl-like world
by ton (Friar) on Sep 27, 2001 at 05:31 UTC
    Apparently Perl is not as seemless in its conversions between strings and floating point numbers as it is in its conversions between strings and integers. Because the following works:

    % perl -le '$foo=0.0; print $foo ? "True" : "False";' False
    but the following does not:
    % perl -le '$foo="0.0"; print $foo ? "True" : "False";' True

    -----
    Be bloody, bold, and resolute; laugh to scorn
    The power of man...
      Perl seems to be assuming that "0.0" is a string, which is fair enough, if that is by design, which I assume it is. "return 0.0" would from a subroutine would evaluate as false.

      Perl will convert "0.0" to a number as soon as you do anything mathematical on it. Such as:
      perl -e '$foo = "0.0" + 0; print $foo ? "True" : "False"'
      Which behaves as you'd expect. This reminds me of (even though it's completely different):
      perl -e 'print "I cannot add" unless 19.08 + 2.01 == 21.09'
      If I remember correctly this comes from an early TPJ article.

      Update: removed ' from print statement - thanks tilly - That's me in hybrid Win32 cmd.exe, Linux shell quoting mode :)

      Simon Flack ($code or die)
      $,=reverse'"ro_';s,$,\$,;s,$,lc ref sub{},e;$,
      =~y'_"' ';eval"die";print $_,lc substr$@,0,3;
        You need to do one of the following to make that work:
        perl -e 'print "I cannot add" unless 19.08 + 2.01 == 21.09' perl -e 'print "I can'\''t add" unless 19.08 + 2.01 == 21.09'
        BTW as Re: Strange (rounding?) problem points out, Perl often handles floats better if you use eq instead of == for testing equality...
Re: Re: Re: A C-like brain in a Perl-like world
by tachyon (Chancellor) on Sep 27, 2001 at 15:16 UTC

    Hey good point! "0.0" is only zero if you force an eval on it one way or another. These are interesting:

    print "0.0 is == 0\n" if "0.0" == 0; $string_zero = "0.0"; print "True" if $string_zero; print "True" if eval $string_zero;

    cheers

    tachyon

    s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://114970]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (7)
As of 2024-04-19 11:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found