Come uso 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. 

In Perl, i seguenti valutano i falsi condizionali:

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

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

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

Qualunque cosa che stringa alla stringa vuota o alla stringa `0` è falsa. Tutto il resto è vero.

Pertanto, i seguenti valori sono falsi:

  • La stringa vuota
  • Valore numerico zero
  • Un valore indefinito
  • Un object 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 “veri zero”

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

Quelle che seguono sono stringhe vere come booleane e zero come numero.

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

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 buon modo per farlo usando il confronto tra 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 “Imansible 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 syntax 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.

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

I miei preferiti sono sempre stati

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

che è completamente indipendente dalla rappresentazione interna.

Mi sono imbattuto in un tutorial che ha una buona spiegazione 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 in esso
  • '00' due o più 0 caratteri in una stringa
  • "0\n" a 0 seguito da una nuova riga
  • 'true'
  • 'false' sì, anche la stringa ‘falso’ restituisce true.

C’è un altro buon tutorial che spiega Perl vero e falso .

Bella spiegazione data da bobf per i valori booleani: vero o falso? Una guida di riferimento rapido

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 

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.