wake-up-neo.com

Wie verwende ich boolesche Variablen in Perl?

Ich habe versucht:

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

Keine dieser Arbeiten. Ich bekomme die Fehlermeldung

Bareword "false" ist nicht zulässig, solange "strict subs" verwendet wird.
213
Chad DeShon

In Perl werden die folgenden Bedingungen als falsch ausgewertet:

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

Der Rest ist wahr. Es gibt keine Barewörter für true oder false.

279

Die vollständigste und prägnanteste Definition von falsch, auf die ich gestoßen bin, ist:

Alles, was in die leere Zeichenfolge oder die Zeichenfolge "0" übergeht, ist falsch. Alles andere ist wahr.

Daher sind die folgenden Werte falsch:

  • Die leere Zeichenfolge
  • Zahlenwert Null
  • Ein undefinierter Wert
  • Ein Objekt mit einem überladenen booleschen Operator, der einen der oben genannten Werte auswertet.
  • Eine magische Variable, die beim Abrufen einen der oben genannten Werte ergibt.

Denken Sie daran, dass ein leeres Listenliteral im skalaren Kontext einen undefinierten Wert ergibt und daher einen falschen Wert ergibt.


Ein Hinweis auf "wahre Nullen"

Während Zahlen, die sich zu 0 sind falsch, Zeichenfolgen, die mit Null nummeriert werden, sind nicht unbedingt erforderlich. Die einzigen falschen Zeichenfolgen sind 0 und die leere Zeichenfolge. Alle anderen Zeichenfolgen, auch wenn sie mit Null nummeriert sind, sind wahr.

Im Folgenden werden Zeichenfolgen aufgeführt, die als Boolescher Wert und als Zahl als Nullwert gelten.

  • Ohne Vorwarnung:
    • "0.0"
    • "0E0"
    • "00"
    • "+0"
    • "-0"
    • " 0"
    • "0\n"
    • ".0"
    • "0."
    • "0 but true"
    • "\t00"
    • "\n0e1"
    • "+0.e-9"
  • Mit einer Warnung:
    • Beliebige Zeichenfolge, für die Scalar::Util::looks_like_number gibt false zurück. (z.B. "abc")
69
ikegami

Perl hat keinen nativen booleschen Typ, aber Sie können einen Vergleich von Ganzzahlen oder Zeichenfolgen verwenden, um dasselbe Verhalten zu erzielen. Alans Beispiel ist ein guter Weg, dies mit einem Vergleich von ganzen Zahlen zu tun. Hier ist ein Beispiel

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

Eine Sache, die ich in einigen meiner Programme getan habe, ist das gleiche Verhalten mit einer Konstante:

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

Die in "use constant" markierten Zeilen definieren eine Konstante mit dem Namen true, die immer 1 ergibt, und eine Konstante mit dem Namen false, die immer 0 ergibt. Aufgrund der Art und Weise, wie Konstanten in Perl definiert sind, schlagen die folgenden Codezeilen ebenfalls fehl:

true = 0;
true = false;

Die Fehlermeldung sollte ungefähr so ​​lauten: "Konstante in Skalarzuweisung kann nicht geändert werden."

Ich habe das in einem der Kommentare gesehen, die Sie zum Vergleichen von Zeichenfolgen gefragt haben. Da Perl Zeichenfolgen und numerische Typen in skalaren Variablen kombiniert, sollten Sie wissen, dass Sie für den Vergleich von Zeichenfolgen und Zahlen unterschiedliche Syntax verwenden:

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

Der Unterschied zwischen diesen Operatoren führt in Perl häufig zu Verwirrung.

57
James Thompson

Ich empfehle use boolean;. Sie müssen jedoch das boolean Modul von cpan installieren.

16
xenoterracide

Meine Favoriten waren schon immer

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

das ist völlig unabhängig von der internen Darstellung.

10
syck

Ich bin auf ein Tutorial gestoßen, das ausführlich erklärt , welche Werte in Perl wahr und falsch sind . Es heißt, dass:

Folgende Skalarwerte gelten als falsch:

  • undef - der undefinierte Wert
  • 0 die Zahl 0, auch wenn Sie sie als 000 oder 0,0 schreiben
  • '' die leere Zeichenfolge.
  • '0' die Zeichenfolge, die eine einzelne 0-Stelle enthält.

Alle anderen skalaren Werte, einschließlich der folgenden, sind wahr:

  • 1 jede Zahl, die nicht 0 ist
  • ' ' die Zeichenkette mit einem Leerzeichen
  • '00' zwei oder mehr 0 Zeichen in einer Zeichenfolge
  • "0\n" a 0 gefolgt von einer neuen Zeile
  • 'true'
  • 'false' ja, auch der String 'false' ergibt true.

Es gibt ein weiteres gutes Tutorial, in dem erklärt wird, wie Perl wahr und falsch .

7
serenesat

Schöne Erklärung von bobf für Boolesche Werte: Richtig oder Falsch? Eine Kurzanleitung

Wahrheitstests für verschiedene Werte

                       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

verwenden Sie das folgende Dateipräfix. Dies fügt Ihrem Perl-Skript eTRUE und eFALSE hinzu. Es ist REAL (!) true und false (genau wie 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' )
             };

Es gibt eigentlich nur wenige Gründe, warum Sie das verwenden sollten.

Mein Grund ist, dass ich bei der Arbeit mit JSON 0 und 1 als Werte für Schlüssel habe, aber dieser Hack stellt sicher, dass die richtigen Werte in Ihrem Skript beibehalten werden.

0
user257319