Eu tentei:
$var = false;
$var = FALSE;
$var = False;
Nenhum desses trabalhos. Eu recebo a mensagem de erro
A palavra de barra "false" não é permitida enquanto "subs estritos" estiver em uso.
Eu tentei:
$var = false;
$var = FALSE;
$var = False;
Nenhum desses trabalhos. Eu recebo a mensagem de erro
A palavra de barra "false" não é permitida enquanto "subs estritos" estiver em uso.
Respostas:
No Perl, o seguinte é avaliado como falso em condicionais:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
O resto é verdade. Não há palavras de barra para trueou false.
undef.
('')e ''tem o mesmo valor. Eu acho que você queria sugerir uma lista com um elemento que consiste em uma string vazia (embora parens não crie listas), mas como eu já mencionei, é impossível verificar se uma lista é verdadeira ou falsa.
!0aka PL_sv_yes) e false ( !1aka PL_sv_no). Ou você está dizendo que o Perl deve coaxar sempre que algo além desses dois valores é testado quanto à veracidade? Isso seria completamente horrível. por exemplo, impediria$x ||= $default;
A definição mais completa e concisa de false que eu me deparei é:
Qualquer coisa que seja string como string vazia ou string
0é falsa. Tudo o resto é verdade.
Portanto, os seguintes valores são falsos:
Lembre-se de que um literal de lista vazia é avaliado como um valor indefinido no contexto escalar; portanto, é avaliado como algo falso.
Uma nota sobre "zeros verdadeiros"
Enquanto os números que strings 0são falsos, os strings que zero são zero não são necessariamente. As únicas strings falsas são 0e a string vazia. Qualquer outra string, mesmo que numere como zero, é verdadeira.
A seguir, são seqüências de caracteres verdadeiras como booleanas e zero como número:
"0.0""0E0""00""+0""-0"" 0""0\n"".0""0.""0 but true""\t00""\n0e1""+0.e-9"Scalar::Util::looks_like_numberretorna false. (por exemplo "abc")my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };. Agora, $valueserá definido como "XXX", mas será boolificado como falso.
boolrealmente é string 0. Além disso, você é desencorajado de criar sobrecargas inconsistentes e os valores retornados podem ser considerados como tais. (por exemplo, um &&pode ser otimizado em um ||, por isso, se estes eram inconsistentes, você teria um problema.)
0x00é coberto aqui.
0x00(o valor numérico zero) ou a string 0x00(para a qual looks_like_numberé falso)? De qualquer forma, já está coberto.
O Perl não tem um tipo booleano nativo, mas você pode usar a comparação de números inteiros ou seqüências de caracteres para obter o mesmo comportamento. O exemplo de Alan é uma boa maneira de fazer isso usando comparação de números inteiros. Aqui está um exemplo
my $boolean = 0;
if ( $boolean ) {
print "$boolean evaluates to true\n";
} else {
print "$boolean evaluates to false\n";
}
Uma coisa que eu fiz em alguns dos meus programas é adicionar o mesmo comportamento usando uma constante:
#!/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";
}
As linhas marcadas em "use constant" definem uma constante chamada true que sempre é avaliada como 1 e uma constante chamada false que sempre é avaliada por 0. Devido à maneira como as constantes são definidas no Perl, as seguintes linhas de código também falham:
true = 0;
true = false;
A mensagem de erro deve dizer algo como "Não é possível modificar constante na atribuição escalar".
Vi isso em um dos comentários que você perguntou sobre a comparação de strings. Você deve saber que, como o Perl combina sequências e tipos numéricos em variáveis escalares, você tem uma sintaxe diferente para comparar sequências e números:
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";
}
A diferença entre esses operadores é uma fonte muito comum de confusão no Perl.
use warnings;em vez de#! perl -w
if ($exitstatus) { exit; }vs if ($exitstatus == true) { exit; }, o que pode não ser óbvio para um observador casual. (E sim, o último exemplo é um estilo de programação ruim, mas isso não vem ao caso).
Eu recomendo use boolean;. Você precisa instalar o módulo booleano do cpan.
if ($my_true_value == true). Fingir que existe Uma Verdade Verdadeira é, na minha experiência, um caminho para a dor e um código ineficiente.
Meus favoritos sempre foram
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
que é completamente independente da representação interna.
Me deparei com um tutorial que tem uma boa explicação sobre quais valores são verdadeiros e falsos no Perl . Afirma que:
Os seguintes valores escalares são considerados falsos:
undef - o valor indefinido0 o número 0, mesmo se você o escrever como 000 ou 0,0'' a string vazia.'0' a sequência que contém um único dígito 0.Todos os outros valores escalares, incluindo o seguinte, são verdadeiros:
1 qualquer número diferente de 0' ' a corda com um espaço nela'00' dois ou mais 0 caracteres em uma sequência"0\n" um 0 seguido por uma nova linha'true''false' sim, até a string 'false' é avaliada como true.Há outro bom tutorial que explica sobre Perl verdadeiro e falso .
Linda explicação dada por bobf para valores booleanos: Verdadeiro ou Falso? Um Guia de Referência Rápida
Testes de verdade para diferentes valores
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
use o seguinte prefixo de arquivo, isso adicionará ao seu script perl eTRUE e eFALSE; na verdade, será REAL (!) verdadeiro e falso (como 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' )
};
Na verdade, existem algumas razões pelas quais você deve usar isso.
Meu motivo é que, trabalhando com JSON, tenho 0 e 1 como valores para as chaves, mas esse hack garantirá que os valores corretos sejam mantidos ao longo do seu script.