web-dev-qa-db-ger.com

Wie vergleiche ich zwei Zeichenfolgen in Perl?

Wie vergleiche ich zwei Zeichenfolgen in Perl?

Ich lerne Perl. Ich hatte diese grundlegende Frage hier auf StackOverflow nachgeschlagen und keine gute Antwort gefunden. Ich dachte, ich würde fragen.

167
PJT

Siehe perldoc perlop . Verwenden Sie lt, gt, eq, ne und cmp entsprechend für Zeichenfolgenvergleiche:

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 mit dem rechten Argument übereinstimmt.

Binär cmp gibt -1, 0 oder 1 zurück, je nachdem, ob das linke Argument kleiner, gleich oder größer als das rechte Argument ist.

Binär ~~ führt einen Smartmatch zwischen seinen Argumenten durch. ...

lt, le, ge, gt und cmp verwenden die im aktuellen Gebietsschema angegebene Sortierreihenfolge (Sortierreihenfolge), wenn eine ältere Verwendung vorliegt Gebietsschema (aber nicht use locale ':not_characters') ist in Kraft. Siehe perllocale . Mischen Sie diese nicht mit Unicode, sondern nur mit älteren Binärcodierungen. Die Standardmodule nicode :: Collate und nicode :: Collate :: Locale bieten viel leistungsfähigere Lösungen für Sortierprobleme.

171
Sinan Ünür
  • cmp Vergleichen

    '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 gleich

    '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 Kleiner als oder gleich

    '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 oder gleich

    'a' ge  'b' #  0
    'b' ge  'a' #  1
    'a' ge  'a' #  1
    

Weitere Informationen finden Sie unter perldoc perlop .

(Ich vereinfache dies ein wenig, da alle außer cmp einen Wert zurückgeben, der sowohl eine leere Zeichenfolge als auch einen numerischen Nullwert anstelle von 0 Und einen Wert, der beide Zeichenfolgen sind '1' Und der numerische Wert 1 Sind dieselben Werte, die Sie immer von Booleschen Operatoren in Perl erhalten. In diesem Fall sollten Sie die Rückgabewerte eigentlich nur für Boolesche oder numerische Operationen verwenden der unterschied ist eigentlich egal.)

132
Brad Gilbert

Zusätzlich zu Sinan Ünürs umfassender Auflistung von String-Vergleichsoperatoren fügt Perl 5.10 den Smart-Match-Operator hinzu.

Der Smart Match-Operator vergleicht zwei Elemente nach ihrem Typ. Die folgende Tabelle zeigt das Verhalten von 5.10 (ich glaube, dass sich dieses Verhalten in 5.10.1 geringfügig ändert):

perldoc perlsyn "Smart Matching im Detail" :

Das Verhalten eines intelligenten Matches hängt von der Art der Argumente ab. Es ist immer kommutativ, d. H. $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 Implizierter Übereinstimmungscode 
 ============================ == ============ 
 (Überladung übertrumpft alles) 
 
 Code [+] Code [+] referentielle Gleichheit $ a == $ b 
 Beliebiger Code [+] skalare Unterwahrheit $ b -> ($ a) 
 
 Hash Hash-Schlüssel identisch [Sortierschlüssel% $ a] ~~ [Sortierschlüssel% $ b] 
 Hash-Array-Hash-Slice-Existenz grep {exists $ a -> {$ _}} @ $ b 
 Hash-Regex-Hash-Schlüssel grep grep/$ b /, keys% $ a 
 Hash Jede Hash-Eintrag-Existenz existiert $ a -> {$ b} 
 
 Array Array Arrays sind identisch [*] 
 Array Regex Array grep grep/$ b /, @ $ a 
 Array Num Array enthält number grep $ _ == $ b, @ $ a 
 Array Jedes Array enthält string grep $ _ eq $ b, @ $ a 
 
 Beliebige undefinierte! Definiert $ a 
 Beliebige Regex-Pat tern match $ a = ~/$ b/
 Code () Die Ergebnisse von Code () sind gleich $ a -> () eq $ b -> () 
 Beliebiger Code () einfache Abschlusswahrheit $ b -> () # ignoriert $ a 
 Num numish [!] numeric equality $ a == $ b 
 Beliebige Str-String-Gleichheit $ a äq $ b 
 Beliebige Num-Gleichheit $ a == $ b 
 
 Beliebig Beliebige Zeichenfolgengleichung $ a eq $ b 
 
 + - Dies muss eine Codereferenz sein, deren Prototyp (falls vorhanden) vorliegt nicht "" 
 (Subs mit einem "" Prototyp werden durch den 'Code ()' - Eintrag weiter unten behandelt) 
 * - das heißt, jedes Element stimmt mit dem Element desselben Indexes im anderen überein 
 Array. Wenn ein Zirkelverweis gefunden wird, greifen wir auf die referentielle 
 Gleichheit zurück. 
! - entweder eine reelle Zahl oder eine Zeichenfolge, die wie eine Zahl aussieht 

Der "Matching Code" stellt natürlich nicht den tatsächlichen Matching Code dar, sondern dient lediglich der Erklärung der beabsichtigten Bedeutung. Im Gegensatz zu grep schließt der Smart-Match-Operator, wann immer es möglich ist, kurz.

Benutzerdefinierter Abgleich über Ü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. Siehe overload .

17
Chas. Owens
print "Matched!\n" if ($str1 eq $str2)

Perl verfügt über separate Operatoren für den Zeichenfolgenvergleich und den numerischen Vergleich, um die lose Eingabe in der Sprache zu erleichtern. Sie sollten perlop für alle verschiedenen Operatoren lesen.

10

Der offensichtliche Untertext dieser Frage lautet:

Warum können Sie nicht einfach mit == prüfen, ob zwei Zeichenfolgen identisch sind?

Perl hat keine unterschiedlichen Datentypen für Text und Zahlen. Sie werden beide durch den Typ "Skalar" dargestellt. Anders ausgedrückt: Strings are numbers 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 eq, um 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

Kurz gesagt:

  • Perl hat keinen Datentyp ausschließlich für Textzeichenfolgen
  • verwenden Sie == oder !=, um zwei Operanden als Zahlen zu vergleichen
  • verwenden Sie eq oder ne, um zwei Operanden als Text zu vergleichen

Es gibt viele andere Funktionen und Operatoren, die zum Vergleichen von Skalarwerten verwendet werden können. Die Unterscheidung zwischen diesen beiden Formen ist jedoch ein wichtiger erster Schritt.

7
nobar

Und wenn Sie die Unterschiede zwischen den beiden Zeichenfolgen extrahieren möchten, können Sie String :: Diff verwenden.

1
Helen Craigman