Es gibt Funktion is_upper in Perl, also wie können wir überprüfen, ob eine Zeichenfolge enthältnur Großbuchstaben?
Die einfache Sache ist, es mit der Großbuchstaben-Version von sich selbst zu vergleichen:
if ($str eq uc $str) { print "All the characters are upper case\n";}
aber das wird auch sagen, dass „123“ uns alle Großbuchstaben.
Manchmal ist das nicht das, was du brauchst.
Mindestens ein Großbuchstabe
Zusätzlich zur Überprüfung, ob die Großbuchstabenversion der Zeichenfolge gleich sich selbst ist, möchten wir möglicherweise sicherstellen, dass es mindestens einen Großbuchstaben gibt.Wir können einen regulären Ausdruck verwenden:
if ($str =~ //) { print "There is an upper case letter\n";}
Dies funktioniert mit dem lateinischen ABC, passt aber nicht zu Zeichen wieáéíóöőúüŰ (die Großbuchstaben von áéíóöőúüű) aus dem ungarischen ABC, noch andere seltsame Zeichen wie ein Umlaut Ä (die Großbuchstaben von ä).
Mindestens ein Unicode-Großbuchstabe
Dafür gibt es \p{Uppercase} , das genau einem Unicode-Großbuchstaben entspricht. Es wird also mit einem dieser Zeichen übereinstimmen:ÄAÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÚÜŰVWXYZ
if ($str =~ /\p{Uppercase}/) { print "There is an upper case Unicode letter\n";}
Alle Zeichen sind Unicode-Großbuchstaben
Es reicht möglicherweise nicht aus, einen Großbuchstaben zu haben.Möglicherweise müssen Sie alle haben: In diesem Fall können wir die ^ – und $ regex-Anker verwenden, um den Anfang bzw. das Ende der Zeichenfolge abzugleichen.
Wir wenden auch den + Quantifizierer an, der 1 oder mehr der vorhergehenden Sache bedeutet. In unserem Fall eines oder mehrere der vorhergehenden Großbuchstaben.
if ($str =~ /^\p{Uppercase}+$/) { print "There is an upper case Unicode letter\n";}
Alle Zeichen sind Unicode-Großbuchstaben oder Leerzeichen
Natürlich ist es selten, dass ein String nur aus Großbuchstaben besteht.irgendwann wollen wir auch andere Charaktere zulassen. Zum Beispiel möchten wir auch Räume zulassen. In diesem Fall erstellen wir eine Zeichenklasse (in eckigen Klammern), die aus einem Leerzeichen und der Zeichenklasse besteht, die alle Großbuchstaben der Welt darstellt: .
if ($str =~ /^+$/) { print "There is an upper case Unicode letter\n";}
Die Beispiele ausprobieren
Wenn wir das Beispiel ausprobieren, können wir entweder die Zeichenfolgen aus einem file.In in diesem Fall werden wir wahrscheinlich auch möchtenöffnen Sie die Datei mit dem aktivierten UTF-8-Flag:
open(my $fh, '<:encoding(UTF-8)', $filename)
Wenn andererseits die zu vergleichenden Zeichenfolgen im Code enthalten sind, muss use utf8; an den Anfang des Skripts.
In beiden Fällen wird empfohlen, die Standardausgabekanäle zu ändern, um utf-8 mit folgendem zu verwenden:
use open ':std', ':encoding(utf8)';
Versuchen Sie dieses Beispiel:
use strict;use warnings;use 5.010;use utf8;use open ':std', ':encoding(utf8)';foreach my $str ("1", "ä", "äÄ", " Ä", "X", "Á", "É", "Í", "Ö", "Ő", "Ú", "Ü") { if ($str =~ /^+$/) { say $str; } else { say "no $str"; }}