Frage

Ich habe versucht:

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

Keine dieser Arbeit. Ich erhalte die Fehlermeldung

Bareword "false" not allowed while "strict subs" is in use.
War es hilfreich?

Lösung

In Perl, die zu falschen folgenden bewerten in conditionals:

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

Der Rest ist wahr. Es gibt keine Barewords für true oder false.

Andere Tipps

Die vollständigste, knappe Definition von falschen ich begegnet bin ist:

Alles, was auf die leere Zeichenfolge stringifies oder die Zeichenfolge '0' ist falsch. Alles andere ist wahr.

Daher sind die folgenden Werte false:

  • Die leere Zeichenfolge
  • Zahlenwert Null
  • Ein nicht definierter Wert
  • Ein Objekt mit einem überladenen boolean Operator, der eine der oben auswertet.
  • Ein magisches Variable, auf Abruf zu einem der oben auswertet.
Halten Sie

Sie daran, dass eine leere Liste wörtliche auswertet auf einen nicht definierten Wert im Skalarkontext, so wertet es etwas falsch.


Ein Hinweis auf "true Nullen"

Während Zahlen, die falsch 0 stringify sind, Strings, die auf Null numify sind nicht notwendigerweise. Die einzigen falschen Saiten sind 0 und die leere Zeichenkette. Jede andere Zeichenfolge, auch wenn es numifies Null ist, wahr ist.

Die folgenden sind Zeichenfolgen, die als boolean und Null als Zahl wahr sind.

  • Ohne eine Warnung:
    • "0.0"
    • "0E0"
    • "00"
    • "+0"
    • "-0"
    • " 0"
    • "0\n"
    • ".0"
    • "0."
    • "0 but true"
    • "\t00"
    • "\n0e1"
    • "+0.e-9"
  • Mit einer Warnung:
    • Eine beliebige Zeichenfolge für die Scalar::Util::looks_like_number false zurückgibt. (Z "abc")

Perl haben keinen nativen Typ boolean, aber man kann den Vergleich der Zahlen oder Zeichenketten verwenden, um das gleiche Verhalten zu bekommen. Alans Beispiel ist eine schöne Art und Weise zu tun, dass der Vergleich von ganzen Zahlen verwenden. 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 getan habe in einigen meiner Programme hinzugefügt wird, 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 Linien in der Aufschrift „Konstante verwenden“ eine Konstante definieren wahr genannt, dass immer auf 1 auswertet und einen konstanten falsch benannt, dass wertet immer von 0. Wegen der Art und Weise, dass Konstanten in Perl definiert sind, schlägt die folgenden Codezeilen auch:

true = 0;
true = false;

Die Fehlermeldung sollte etwas sagen wie „in skalaren Zuordnung nicht konstant ändern kann.“

sah ich, dass die Kommentare in einer von Ihnen über den Vergleich Strings gefragt. Sie sollten wissen, dass, weil Perl Strings und numerische Typen in Skalarvariablen kombiniert, können Sie unterschiedliche Syntax für Strings und Zahlen zu vergleichen:

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 Betreibern ist eine sehr häufige Quelle der Verwirrung in Perl.

Ich empfehle use boolean;. Sie müssen den Modul von cpan rel="noreferrer">.

Meine Favoriten sind immer

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

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

Ich kam in ein Tutorial , die über eine gut explaination haben Welche Werte sind wahr und falsch in Perl . Es feststellen, dass:

skalare Werte Im folgenden wird als falsch:

  • undef - die nicht definierten Wert
  • 0 die Zahl 0, auch wenn Sie es als 000 oder 0,0
  • schreiben
  • '' die leere Zeichenkette.
  • '0' die Zeichenfolge, die eine einzelne 0 Ziffer enthält.

Alle anderen skalaren Werte, einschließlich der folgenden Bedingungen erfüllt sind:

  • 1 jede Nicht-0-Nummer
  • ' ' die Zeichenfolge mit einem Leerzeichen in es
  • '00' zwei oder mehr 0 Zeichen in einer Zeichenfolge
  • "0\n" a 0 durch eine neue Zeile gefolgt
  • 'true'
  • 'false' ja, auch die Zeichenfolge 'false' true ausgewertet.

Es ist ein weiteres gutes Tutorial, das erklären zu Perl wahr und falsch .

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

Die Wahrheit Tests 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

Verwenden Sie die folgende Datei Präfix, wird dies zu Ihrem Perl-Skript eTRUE und eFALSE hinzufügen, wird es tatsächlich real sein (!) Wahr und falsch (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 einige Gründe, warum sollten Sie diese wählen.

Mein Grund ist, dass mit JSON arbeiten, I 0 und 1 als Wert Schlüssel habe, aber dieser Hack machen sind sicher, korrekte Werte entlang Skript gehalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top