it-swarm.dev

Vieni ad usare le variabili booleane in Perl?

Ho provato:

$var = false;
$var = FALSE;
$var = False;

Nessuno di questi lavori. Ottengo il messaggio di errore

Bareword "false" non è consentito mentre "strict subs" è in uso.
210
Chad DeShon

In Perl, i seguenti valutano i falsi condizionali:

0
'0'
undef
''  # Empty scalar
()  # Empty list
('')

Il resto è vero. Non ci sono parole per true o false.

276

La definizione più completa e concisa di falso che ho trovato è:

Qualsiasi cosa che stringa alla stringa vuota o alla stringa `0` è falso. Tutto il resto è vero.

Pertanto, i seguenti valori sono falsi:

  • La stringa vuota
  • Valore numerico zero
  • Un valore indefinito
  • Un oggetto con un operatore booleano sovraccarico che valuta uno dei precedenti.
  • Una variabile magica che valuta uno dei precedenti in fetch.

Tieni presente che un letterale di lista vuota valuta un valore non definito nel contesto scalare, quindi valuta qualcosa di falso.


Una nota su "true zeroes"

Mentre i numeri che si restringono a 0 sono falsi, le stringhe che numificano a zero non sono necessariamente. Le sole stringhe false sono 0 e la stringa vuota. Qualsiasi altra stringa, anche se numifica a zero, è vera.

Le seguenti sono stringhe vere come booleane e zero come numero.

  • Senza un avviso:
    • "0.0"
    • "0E0"
    • "00"
    • "+0"
    • "-0"
    • " 0"
    • "0\n"
    • ".0"
    • "0."
    • "0 but true"
    • "\t00"
    • "\n0e1"
    • "+0.e-9"
  • Con un avviso:
    • Qualsiasi stringa per cui Scalar::Util::looks_like_number restituisce false. (ad esempio "abc")
69
ikegami

Perl non ha un tipo booleano nativo, ma puoi usare il confronto di interi o stringhe per ottenere lo stesso comportamento. L'esempio di Alan è un bel modo di farlo usando il confronto di interi. Ecco un esempio

my $boolean = 0;
if ( $boolean ) {
    print "$boolean evaluates to true\n";
} else {
    print "$boolean evaluates to false\n";
}

Una cosa che ho fatto in alcuni dei miei programmi è stata aggiunta allo stesso comportamento usando una costante:

#!/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";
}

Le righe contrassegnate in "use constant" definiscono una costante denominata true che viene sempre valutata a 1 e una costante denominata false che viene sempre valutata da 0. A causa del modo in cui le costanti vengono definite in Perl, anche le seguenti righe di codice hanno esito negativo:

true = 0;
true = false;

Il messaggio di errore dovrebbe indicare qualcosa come "Impossibile modificare la costante nell'assegnazione scalare".

L'ho visto in uno dei commenti che hai chiesto sul confronto delle stringhe. Dovresti sapere che poiché Perl combina stringhe e tipi numerici in variabili scalari, hai una sintassi diversa per confrontare stringhe e numeri:

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";
}

La differenza tra questi operatori è una fonte molto comune di confusione in Perl.

57
James Thompson

Raccomando use boolean;. Devi installare il modulo booleano da cpan però.

16
xenoterracide

I miei preferiti sono sempre stati

use constant FALSE => 1==0;
use constant TRUE => not FALSE;

che è completamente indipendente dalla rappresentazione interna.

10
syck

Mi sono imbattuto in un'esercitazione che ha una spiegazione chiara su Quali valori sono veri e falsi in Perl . Si afferma che:

I seguenti valori scalari sono considerati falsi:

  • undef - il valore non definito
  • 0 il numero 0, anche se lo scrivi come 000 o 0.0
  • '' la stringa vuota.
  • '0' la stringa che contiene una singola cifra 0.

Tutti gli altri valori scalari, inclusi i seguenti sono veri:

  • 1 qualsiasi numero diverso da 0
  • ' ' la stringa con uno spazio al suo interno
  • '00' due o più 0 caratteri in una stringa
  • "0\n" a 0 seguito da una nuova riga
  • 'true'
  • 'false' yes, anche la stringa 'false' restituisce true.

C'è un altro buon tutorial che spiega Perl true e false .

7
serenesat

Bella spiegazione data da bobf per i valori booleani: Vero o Falso? Una guida rapida di riferimento

Test di verità per valori diversi

                       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
5
Bharat

usa il seguente prefisso del file, questo aggiungerà al tuo script Perl eTRUE ed eFALSE, sarà in realtà REAL (!) vero e falso (proprio come 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' )
             };

Ci sono, in realtà, alcuni motivi per cui dovresti usarlo.

La mia ragione è che lavorando con JSON, ho 0 e 1 come valori per le chiavi, ma questo hack assicurerà che i valori corretti siano mantenuti lungo il tuo script.

0
user257319