Wie kann ich überprüfen, ob eine Zeichenfolge in Perl leer ist?

94

Ich habe gerade diesen Code verwendet, um zu überprüfen, ob eine Zeichenfolge leer ist:

if ($str == "")
{
  // ...
}

Und auch das gleiche mit dem nicht gleich Operator ...

if ($str != "")
{
  // ...
}

Dies scheint zu funktionieren (glaube ich), aber ich bin mir nicht sicher, ob es der richtige Weg ist oder ob es unvorhergesehene Nachteile gibt. Etwas fühlt sich einfach nicht richtig an.

Nick Bolton
quelle

Antworten:

133

Verwenden Sie für Zeichenfolgenvergleiche in Perl eqoder ne:

if ($str eq "")
{
  // ...
}

Die Operatoren ==und !=sind numerische Vergleichsoperatoren. Sie werden versuchen, beide Operanden in Ganzzahlen umzuwandeln, bevor sie verglichen werden.

Weitere Informationen finden Sie in der Perlop- Manpage.

Greg Hewgill
quelle
Ja, wenn Sie dies verwenden, müssen Sie jedoch vorsichtig sein, dass Sie eine Laufzeitwarnung erhalten, wenn es undef ist und wenn Sie Warnungen verwenden. Viele Möglichkeiten, um die Warnung zu umgehen.
Evan Carroll
89
  1. Aufgrund der Art und Weise, wie Zeichenfolgen in Perl gespeichert werden, wird das Abrufen der Länge einer Zeichenfolge optimiert.
    if (length $str)ist eine gute Möglichkeit, um zu überprüfen, ob eine Zeichenfolge nicht leer ist.

  2. Wenn Sie sich in einer Situation befinden, in der Sie sich noch nicht geschützt haben undef, ist das Allheilmittel für "nicht leer", das nicht warnt if (defined $str and length $str).

Hobbs
quelle
6
Ich denke, dass die Länge der nächste Test ist, den wir zum Ausdruck der Idee haben, dass nichts in der Zeichenfolge ist.
Brian D Foy
6
Upvoted, weil dies if (length($str))ein guter Ansatz ist und nicht fehlschlägt, wenn die Variable nicht definiert ist.
basic6
10

Sie möchten wahrscheinlich "eq" anstelle von "==" verwenden. Wenn Sie sich über einige Randfälle Gedanken machen, möchten Sie möglicherweise auch nach undefinierten suchen:

if (not defined $str) {

# this variable is undefined

}
DmitryK
quelle
1
Sehr nützlich, wenn Sie die Zeichenfolge durch Verschieben eines Arrays erhalten haben, das 0 Elemente enthalten kann.
Dacav
9

Wie bereits von mehreren Personen erwähnt, eqist hier der richtige Betreiber.

Wenn Sie use warnings;in Ihrem Skript sind, erhalten Sie Warnungen darüber (und viele andere nützliche Dinge). Ich würde es auch empfehlen use strict;.

Matthew Slattery
quelle
+1 Cool, ja, ich benutze normalerweise, use strictaber ich aktualisiere alten Code. Wenn ich diesen hinzufüge, erhalte ich Hunderte von Fehlern. Ich werde sie wahrscheinlich eines Tages reparieren.
Nick Bolton
4

Das Konzept einer "richtigen" Vorgehensweise, abgesehen von der Verwendung von CPAN, gibt es in Perl nicht.

Wie auch immer, das sind numerische Operatoren, die Sie verwenden sollten

if($foo eq "")

oder

if(length($foo) == 0)
Whatsisname
quelle
3
Es ist wahr, dass Perl nicht dazu neigt, den "einen wahren Weg" zur Problemlösung zu befürworten, aber das bedeutet nicht, dass es keine stark bevorzugten Redewendungen, Stile und Ansätze gibt. Wie einer der Perl-Stammgäste gerne viel sagt, sind einige Möglichkeiten, Dinge zu tun, wirklich sehr, sehr schlecht (dumm, schlecht beraten, schwer zu pflegen usw.) , Auch wenn es mehr als eine Möglichkeit gibt, Dinge zu tun .)
Telemachos
2
Nur weil es viele Möglichkeiten gibt, heißt das nicht, dass alle Möglichkeiten gleich sind. Das Testen auf leere Zeichenfolgen mit if ($foo == "")beispielsweise ist definitiv falsch, es sei denn, Sie $foomöchten tatsächlich testen, ob im numerischen Kontext ausgewertet der Wert 0 ist (in diesem Fall wäre es immer noch besser geschrieben als if ($foo == 0), da dies Ihre deutlicher ausdrückt Absicht).
Dave Sherohman
0

Um nach einer leeren Zeichenfolge zu suchen, können Sie auch wie folgt vorgehen

if (!defined $val || $val eq '')
{
    # empty
}
Roland Ayala
quelle