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

Hello, Once and a while I have problems with boolean values in my scripts. Can someone please explain why is this:
if (false) { print "I do always get printed...\n" } if (false==true) { print "..and even do I" }
and the same in "x ? y : z" style. Only when I'm using numerical forms i.e. false=0 and true=1, 0 never is true: if (0) { print "they never print me." } What's wrong with literal values? I'm using -v 5.6.1 and ActiveState's 5.8.

Replies are listed 'Best First'.
Re: question about the Truth
by Roger (Parson) on Jan 15, 2004 at 07:10 UTC
    Did you declare 'false' and 'true' as constants?
    use constant false=>0; use constant true=>1; if (false) { print "I do always get printed...\n" } if (false==true) { print "..and even do I" }
    Otherwise the barewords 'false' and 'true' are treated as strings. Now if you rewrite false==true as  false eq true, the second print will never be executed.

      Thank you for your reply. Yet another reason why one should always use 'perl -w'
Re: question about the Truth
by Anonymous Monk on Jan 15, 2004 at 07:12 UTC
    Perl has never had the values "true" and "false" assigned to literals. You could do use constant true => 1; use constant false => 0;
Re: question about the Truth
by bart (Canon) on Jan 16, 2004 at 13:05 UTC
    I have to warn you, that comparing to true or false is a very unperlish thing to do. 1 is considered as true, yes, but so is 2, 3.14, and "aardvark". In short: don't ever do
    if($flag==true) { ...
    because you'll get a false response for any case where $flag is a true value, but not the same as the value for your constant true.

    In Perl, you should just be using

    if($flag) { ...
    if you want to test if it's true, and any of
    if(!$flag) { ... if(not $flag) { ... unless($flag) { ...
    to test for false.

    p.s. An additional warning: All of undef, 0, "" and "0" are considered false in Perl. Perhaps that's too forgiving for you, and you explicitely want to distinguish between them. Use of defined, and of

    $value eq ""
    are typical idioms to deal with that. And no, you're not supposed to make a distinction between 0 and "0".

    Thank you for your time.