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 true
ou 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.
!0
aka PL_sv_yes
) e false ( !1
aka 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 0
são falsos, os strings que zero são zero não são necessariamente. As únicas strings falsas são 0
e 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_number
retorna false. (por exemplo "abc"
)my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };
. Agora, $value
será definido como "XXX", mas será boolificado como falso.
bool
realmente é 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.