I have tried:
$var = false;
$var = FALSE;
$var = False;
None of these work. I get the error message
Bareword "false" not allowed while "strict subs" is in use.
Truth and Falsehood in man perlsyn explains:
The number 0, the strings '0' and "", the empty list "()", and "undef" are all false in a boolean context. All other values are true.
In Perl, the following evaluate to false in conditionals:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
The rest are true. There are no barewords for true or false. (Note: Perl v5.38 introduced true and false through the new builtin pragma).
undef.('') and '' are the same value. I think you wanted to imply a list with an element that consists of an empty string (even though parens don't create lists), but as I've already mentioned, it's impossible to check if a list is true of false.!0 aka PL_sv_yes) and false (!1 aka PL_sv_no). Or are you saying Perl should croak whenever something other than these two values are tested for truthness? That would be completely awful. e.g. It would prevent $x ||= $default;Since 5.36, you can use true and false from the builtin module/namespace. These are special true and false values that can be identified using is_bool. This is an experimental feature at this time.
But while these could be said to return the true and false, they are are but a true or false value respectively. In fact, every scalar is either true or false.
The most complete, concise definition of a false value I've come across is:
Anything that stringifies to the empty string or the string
0is false. Everything else is true.
Therefore, the following values are false:
0.Any other scalar is true.
A note on "true zeroes"
While numbers that stringify to 0 are false, strings that numify to zero aren't necessarily. The only false strings are 0 and the empty string. Any other string, even if it numifies to zero, is true.
The following are strings that are true as a boolean and zero as a number:
"0.0""0E0""00""+0""-0"" 0""0\n"".0""0.""0 but true""\t00""\n0e1""+0.e-9"Scalar::Util::looks_like_number returns false. (e.g. "abc")my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };. Now $value will stringify to "XXX" but boolifies to false.bool does stringify to 0. Also, you are discouraged from creating inconsistent overloads, and the values you return could be considered such. (e.g. a && can be optimized into a ||, so if these were inconsistent, you'd have a problem.)0x00 is covered here.Perl doesn't have a native boolean type, but you can use comparison of integers or strings in order to get the same behavior. Alan's example is a nice way of doing that using comparison of integers. Here's an example
my $boolean = 0;
if ( $boolean ) {
print "$boolean evaluates to true\n";
} else {
print "$boolean evaluates to false\n";
}
One thing that I've done in some of my programs is added the same behavior using a constant:
#!/usr/bin/perl
use strict;
use warnings;
use constant false => 0;
use constant true => 1;
my $val1 = true;
my $val2 = false;
print $val1, " && ", $val2;
if ( $val1 && $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
print $val1, " || ", $val2;
if ( $val1 || $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
The lines marked in "use constant" define a constant named true that always evaluates to 1, and a constant named false that always evaluates by 0. Because of the way that constants are defined in Perl, the following lines of code fails as well:
true = 0;
true = false;
The error message should say something like "Can't modify constant in scalar assignment."
I saw that in one of the comments you asked about comparing strings. You should know that because Perl combines strings and numeric types in scalar variables, you have different syntax for comparing strings and numbers:
my $var1 = "5.0";
my $var2 = "5";
print "using operator eq\n";
if ( $var1 eq $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
print "using operator ==\n";
if ( $var1 == $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
The difference between these operators is a very common source of confusion in Perl.
use warnings; instead of #! perl -wif ($exitstatus) { exit; } vs if ($exitstatus == true) { exit; }, which might not be obvious to a casual observer. (And yes, the last example is poor programming style, but that is beside the point).use constant EX_SUCCESS => 0. Now you don't care if that is true or false as long as it matches in $exit_status == EX_SUCCESS.I recommend use boolean;. You have to install the boolean module from CPAN though.
if ($my_true_value == true). Pretending that there is One True Truth is, in my experience, a path to pain, and inefficient code.My favourites have always been
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
which is completely independent from the internal representation.
$var eq TRUE or $var == TRUE will now fail for almost all true values except for two of them. Conversely, the FALSE will work for almost all values except a couple of them. Then you are left with something like ($var eq $foo) == TRUE or !! $var == TRUE, but those are just silly.I came across a tutorial which have a well explaination about What values are true and false in Perl. It state that:
Following scalar values are considered false:
undef - the undefined value0 the number 0, even if you write it as 000 or 0.0'' the empty string.'0' the string that contains a single 0 digit.All other scalar values, including the following are true:
1 any non-0 number' ' the string with a space in it'00' two or more 0 characters in a string"0\n" a 0 followed by a newline'true''false' yes, even the string 'false' evaluates to true.There is another good tutorial which explain about Perl true and false.
Beautiful explanation given by bobf for Boolean values : True or False? A Quick Reference Guide
Truth tests for different values
Result of the expression when $var is:
Expression | 1 | '0.0' | a string | 0 | empty str | undef
--------------------+--------+--------+----------+-------+-----------+-------
if( $var ) | true | true | true | false | false | false
if( defined $var ) | true | true | true | true | true | false
if( $var eq '' ) | false | false | false | false | true | true
if( $var == 0 ) | false | true | true | true | true | true
if( $var ) doesn't mean true for all strings. The empty string and the string of exactly 0 are false. Likewise, in the other rows, you have to know what is in $var for the "a string" column,. The last three rows are operators that return true or false, so their rows aren't that interesting.Perl v5.38 introduced experimental "distinguished booleans" through the new builtin pragma. This means that you now have the true or false that you wanted.
use v5.38;
use experimental qw(builtin);
use builtin qw(true false);
my $var = false;
use the following file prefix, this will add to your perl script eTRUE and eFALSE, it will actually be REAL(!) true and false (just like java)
#!/usr/bin/perl
use strict;
use warnings;
use constant { #real true false, compatible with encode_json decode_json for later (we don't want field:false... will be field:0...)
eTRUE => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
eFALSE => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' )
};
There are, actually, few reasons why you should use that.
My reason is that working with JSON, I've got 0 and 1 as values to keys, but this hack will make sure correct values are kept along your script.
Booleans in Raku (the programming language formerly known as Perl_6):
~$ raku
Welcome to 𝐑𝐚𝐤𝐮𝐝𝐨™ v2021.06.
Implementing the 𝐑𝐚𝐤𝐮™ programming language v6.d.
Built on MoarVM version 2021.06.
To exit type 'exit' or '^D'
> my $var = False;
False
> say $var;
False
> say $var.^name
Bool
> say $var.WHAT
(Bool)
> say ++$var
True
> say --$var
False
> say $var.Int
0
> say $var.Int + 1
1
> say ($var.Int + 1).Bool
True
> say $var.Int - 1
-1
> say ($var.Int - 1).Bool
True
> say $var.succ
True
> say $var.Int.succ
1
> say $var.pred
False
> say $var.Int.pred
-1
> say ++($var.Int); #ERROR
Cannot resolve caller prefix:<++>(Int:D); the following candidates
match the type but require mutable arguments:
(Mu:D $a is rw)
(Int:D $a is rw --> Int:D)
#<SNIP>
> say --($var.Int); #ERROR
Cannot resolve caller prefix:<-->(Int:D); the following candidates
match the type but require mutable arguments:
(Mu:D $a is rw)
(Int:D $a is rw --> Int:D)
#<SNIP>
> exit
https://docs.raku.org/type/Bool
https://docs.raku.org/language/syntax#index-entry-Boolean_(literals)
trueandfalse"distinguished booleans" through the newbuiltinpackage