6 Stimmen

Wie kann ich in Perl zwischen 0 und Leerzeichen unterscheiden?

Ich habe den folgenden Code-Abschnitt in meinem Programm:

$val = chr(someFunction());

if($val == " ")
{
    #do something

}
elsif($val == 0)
{
   #do something else
}

Aber immer wenn 0 an $val übergeben wird, wird der if-Teil ausgeführt, anstatt des elsif-Teils, den ich erwartet habe.

Wie kann ich das beheben?

Vielen Dank.

23voto

1800 INFORMATION Punkte 125009

Der == Operator wird verwendet, um numerische Werte zu vergleichen. Wenn du Strings vergleichen möchtest, solltest du den eq Operator verwenden.

if ($val eq " ") ...

5voto

Chas. Owens Punkte 62716

Es gibt mehrere Möglichkeiten, dies zu beheben (TIMTOWDI). Sie könnten die looks_like_a_number-Funktion aus dem Standard-Paket Scalar::Util importieren:

if (looks_like_a_number($val) and $val == 0) {
    #etwas tun
}

Sie könnten den String-Gleichheitsoperator verwenden

if ($val eq 0) {
    #etwas tun
}

Wenn Sie Perl 5.10 haben, könnten Sie den klugen Vergleichsoperator verwenden

if ($val ~~ 0) {
    #etwas tun
}

Und viele mehr. Welche Methode Sie verwenden, hängt stark davon ab, was Sie erreichen möchten.

3voto

daotoad Punkte 26089

Wenn Sie Warnungen aktiviert hätten, hätten Sie gewusst, was das Problem war.

Führen Sie dies aus:

use strict;
use warnings;

my $val = chr(someFunction());

if($val == " ")
{
    #etwas machen

}
elsif($val == 0)
{
   #etwas anderes machen
}

sub someFunction {
    return 1;
}

Und Sie erhalten: C:>test.pl Argument " " ist nicht numerisch in numerischer eq (==) in Zeile 6 von C:\test.pl. Argument "^A" ist nicht numerisch in numerischer eq (==) in Zeile 6 von C:\test.pl.

Durch das Hinzufügen von use diagnostics erhalten wir diese zusätzliche Erklärung:

   (W numerisch) Der angegebene String wurde als Argument an einen Operator übergeben,
   der stattdessen einen numerischen Wert erwartete. Wenn Sie Glück haben, wird die Meldung
   identifizieren, welcher Operator so unglücklich war.

Also, da wir kein numerisches eq wollen, sondern ein string eq: eq. Wenn Sie das nicht bereits wussten, könnten Sie in perldoc perlop nachschlagen, um über Gleichheitsoperatoren zu lesen.

Dies ist ein klassisches Beispiel dafür, wie die Verwendung der Pragmas warnings und strict Zeit spart.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X