Wie vergleiche ich zwei Zeichenfolgen in Perl?
Ich lerne Perl, ich hatte diese grundlegende Frage hier auf StackOverflow nachgeschlagen und fand keine gute Antwort, also dachte ich, ich würde fragen.
Wie vergleiche ich zwei Zeichenfolgen in Perl?
Ich lerne Perl, ich hatte diese grundlegende Frage hier auf StackOverflow nachgeschlagen und fand keine gute Antwort, also dachte ich, ich würde fragen.
Antworten:
Siehe Perldoc Perlop . Verwenden Sie lt
, gt
, eq
, ne
, und cmp
als geeignet für String - Vergleiche:
Binary
eq
gibt true zurück, wenn das linke Argument dem rechten Argument entspricht.Binary
ne
gibt true zurück, wenn das linke Argument nicht dem rechten Argument entspricht.Binary
cmp
gibt -1, 0 oder 1 zurück, je nachdem, ob das linke Argument in der Zeichenfolge kleiner, gleich oder größer als das rechte Argument ist.Binary
~~
führt ein Smartmatch zwischen seinen Argumenten durch. ...
lt
,le
,ge
,gt
Undcmp
die Sortierung (sortiert) , um von der aktuellen Locale angegeben verwenden , wenn ein Legacy - Anwendung locale (aber nichtuse locale ':not_characters'
) in Kraft ist. Siehe Perllocale . Mischen Sie diese nicht mit Unicode, sondern nur mit älteren Binärcodierungen. Die Standardmodule Unicode :: Collate und Unicode :: Collate :: Locale bieten viel leistungsfähigere Lösungen für Sortierprobleme .
index
zu sehen, ob eine Zeichenfolge eine Teilzeichenfolge einer anderen ist.
!=
und ne
sind nicht gleich, weil !=
und ne
als unterschiedlich definiert sind. Wie schwer ist das?! !=
Konvertiert als numerischer Vergleichsoperator beide Operanden in Zahlen perl -E 'say "equal" if not "a" != "b"'
.
cmp
Vergleichen Sie
'a' cmp 'b' # -1
'b' cmp 'a' # 1
'a' cmp 'a' # 0
eq
Gleich
'a' eq 'b' # 0
'b' eq 'a' # 0
'a' eq 'a' # 1
ne
Nicht gleichzusetzen mit
'a' ne 'b' # 1
'b' ne 'a' # 1
'a' ne 'a' # 0
lt
Weniger als
'a' lt 'b' # 1
'b' lt 'a' # 0
'a' lt 'a' # 0
le
Gleich oder kleiner als
'a' le 'b' # 1
'b' le 'a' # 0
'a' le 'a' # 1
gt
Größer als
'a' gt 'b' # 0
'b' gt 'a' # 1
'a' gt 'a' # 0
ge
Größer als oder gleich wie
'a' ge 'b' # 0
'b' ge 'a' # 1
'a' ge 'a' # 1
Siehe perldoc perlop
für weitere Informationen.
(Ich vereinfache dies ein wenig, gebe aber cmp
einen Wert zurück, der sowohl eine leere Zeichenfolge als auch einen numerischen Nullwert anstelle von 0
und einen Wert ist, der sowohl die Zeichenfolge '1'
als auch den numerischen Wert ist 1
. Dies sind die gleichen Werte, die Sie verwenden werden Immer von booleschen Operatoren in Perl erhalten. Sie sollten wirklich nur die Rückgabewerte für boolesche oder numerische Operationen verwenden. In diesem Fall spielt der Unterschied keine Rolle.)
eq
, gt
, lt
etc. sind nicht richtig ... Sie kehren wahr oder falsch. Nur cmp
gibt bestimmte numerische Werte.
leg
stattdessen cmp
für generische Vergleiche verwendet werden.
Zusätzlich zu Sinan Ünürs umfassender Liste von String-Vergleichsoperatoren fügt Perl 5.10 den Smart Match-Operator hinzu.
Der Smart Match-Operator vergleicht zwei Elemente anhand ihres Typs. In der folgenden Tabelle finden Sie das Verhalten von 5.10 (ich glaube, dieses Verhalten ändert sich in 5.10.1 geringfügig):
perldoc perlsyn
"Smart Matching im Detail" :Das Verhalten eines Smart Matchs hängt davon ab, um welche Art von Argumenten es sich handelt. Es ist immer kommutativ, dh es
$a ~~ $b
verhält sich genauso wie$b ~~ $a
. Das Verhalten wird durch die folgende Tabelle bestimmt: Die erste Zeile, die in beliebiger Reihenfolge angewendet wird, bestimmt das Übereinstimmungsverhalten.
$ a $ b Art der Übereinstimmung Impliziter Übereinstimmungscode ====== ===== ====================== (Überladung übertrumpft alles) Code [+] Code [+] referentielle Gleichheit $ a == $ b Beliebige skalare Code [+] -Unterwahrheit $ b -> ($ a) Hash Hash Hash-Schlüssel identisch [Sortierschlüssel% $ a] ~~ [Sortierschlüssel% $ b] Hash Array Hash Slice Existenz grep {existiert $ a -> {$ _}} @ $ b Hash Regex Hash-Schlüssel grep grep / $ b /, Schlüssel% $ a Hash Es existiert ein Hash-Eintrag $ a -> {$ b} Array Array-Arrays sind identisch [*] Array Regex-Array grep grep / $ b /, @ $ a Array Num Array enthält die Nummer grep $ _ == $ b, @ $ a Array Jedes Array enthält den String grep $ _ eq $ b, @ $ a Alle undef undefined! Defined $ a Jedes Regex-Muster entspricht $ a = ~ / $ b / Code () Code () Ergebnisse sind gleich $ a -> () eq $ b -> () Jeder Code () einfache Abschlusswahrheit $ b -> () # ignoriert $ a Num numish [!] Numerische Gleichheit $ a == $ b Beliebige Str-String-Gleichheit $ a eq $ b Beliebige numerische Gleichheit $ a == $ b Beliebig Beliebige Zeichenfolgengleichheit $ a eq $ b + - Dies muss eine Code-Referenz sein, deren Prototyp (falls vorhanden) nicht "" ist. (Subs mit einem "" Prototyp werden durch den Eintrag "Code ()" weiter unten behandelt) * - Das heißt, jedes Element entspricht dem Element desselben Index im anderen Array. Wenn eine Zirkelreferenz gefunden wird, greifen wir auf die Referenz zurück Gleichberechtigung. ! - entweder eine reelle Zahl oder eine Zeichenfolge, die wie eine Zahl aussiehtDer "Übereinstimmungscode" repräsentiert natürlich nicht den tatsächlichen Übereinstimmungscode: Er dient nur dazu, die beabsichtigte Bedeutung zu erklären. Im Gegensatz zu grep wird der Smart Match-Operator kurzschließen, wann immer er kann.
Benutzerdefinierter Abgleich durch Überladen Sie können die Art und Weise ändern, in der ein Objekt abgeglichen wird, indem Sie den
~~
Operator überladen . Dies übertrifft die übliche Smart-Match-Semantik. Sieheoverload
.
print "Matched!\n" if ($str1 eq $str2)
Perl verfügt über separate Zeichenfolgenvergleichs- und numerische Vergleichsoperatoren, um die lose Eingabe in der Sprache zu erleichtern. Sie sollten Perlop für alle verschiedenen Operatoren lesen .
Der offensichtliche Untertext dieser Frage lautet:
Warum können Sie nicht einfach
==
überprüfen, ob zwei Zeichenfolgen gleich sind?
Perl hat keine unterschiedlichen Datentypen für Text oder Zahlen. Sie werden beide durch den Typ "Skalar" dargestellt . Anders ausgedrückt, Zeichenfolgen sind Zahlen, wenn Sie sie als solche verwenden .
if ( 4 == "4" ) { print "true"; } else { print "false"; }
true
if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true
print "3"+4
7
Da Text und Zahlen nicht durch die Sprache unterschieden werden, können wir den ==
Operator nicht einfach überladen , um in beiden Fällen das Richtige zu tun. Daher bietet Perl die Möglichkeit eq
, Werte als Text zu vergleichen:
if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false
if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true
Zusamenfassend:
==
oder !=
, um zwei Operanden als Zahlen zu vergleicheneq
oder ne
, um zwei Operanden als Text zu vergleichenEs gibt viele andere Funktionen und Operatoren, mit denen Skalarwerte verglichen werden können. Die Unterscheidung zwischen diesen beiden Formen ist jedoch ein wichtiger erster Schritt.
Und wenn Sie die Unterschiede zwischen den beiden Zeichenfolgen extrahieren möchten, können Sie String :: Diff verwenden .