det finns funktion is_upper i Perl, så hur kan vi kontrollera om en sträng innehållerbara stora bokstäver?
det enkla är att jämföra det med versaler versionen av sig själv:
if ($str eq uc $str) { print "All the characters are upper case\n";}
men detta kommer också att säga att” 123 ” oss alla versaler.
Ibland är det inte vad du behöver.
minst en versaler
förutom att kontrollera om versaler versionen av strängen är lika med sig själv, kanske vi vill se till att det finns minst en versaler.Vi kan använda en regex:
if ($str =~ //) { print "There is an upper case letter\n";}
detta kommer att fungera med det latinska ABC, men kommer inte att matcha tecken some brasilian (versaler versioner av brasilian) från den ungerska ABC,inte heller andra konstiga tecken som en Umlaut brasilian (versaler version av brasilian).
minst en versaler Unicode bokstav
För att det finns \p{versaler} som matchar exakt en övre caseUnicode tecken. Så det kommer att matcha någon av dessa:ÄAÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÚÜŰVWXYZ
if ($str =~ /\p{Uppercase}/) { print "There is an upper case Unicode letter\n";}
Alla tecken i versaler Unicode bokstäver
Det kan inte vara tillräckligt för att få en versal bokstav.Du kan behöva ha dem alla: i så fall kan vi använda ^ och $ regex förankringarför att matcha början och slutet av strängen respektive.
Vi tillämpar också + kvantifieraren som betyder 1 eller mer av thepreceding sak. I vårt fall en eller flera av föregående versaler.
if ($str =~ /^\p{Uppercase}+$/) { print "There is an upper case Unicode letter\n";}
alla tecken är versaler Unicode bokstäver eller mellanslag
naturligtvis är det sällsynt att en sträng endast skulle bestå av versaler.ibland vill vi också tillåta andra tecken. Till exempel vill vi tillåta utrymmen också. I det här fallet skapar vi en karaktärsklass (i hakparenteser)som är uppbyggd från ett mellanslag och karaktärsklassen som representerar alla stora bokstäver i världen: .
if ($str =~ /^+$/) { print "There is an upper case Unicode letter\n";}
försöker exemplen
När vi försöker exemplet kan vi antingen läsa strängarna från a file.In det fallet kommer vi förmodligen att viljaöppna filen med UTF-8-flaggan aktiverad:
open(my $fh, '<:encoding(UTF-8)', $filename)
å andra sidan, om strängarna som ska jämföras finns i koden,måste man lägga till Använd utf8; till början av skriptet.
i båda fallen rekommenderas att du ändrar standardutgångskanalerna för att använda utf-8 med följande:
use open ':std', ':encoding(utf8)';
prova detta exempel:
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"; }}