v Perlu je funkce is_upper, takže jak můžeme zkontrolovat, zda řetězec obsahuje pouze velká písmena?
jednoduchou věc, je porovnat ji s horní-případ, verze sama o sobě:
if ($str eq uc $str) { print "All the characters are upper case\n";}
ale to vám také říci, že „123“ nás všechny velká písmena.
někdy to není to, co potřebujete.
alespoň jedno velké písmeno
kromě toho, aby se kontrola, zda horní případě verze řetězce se rovná sama sobě,bychom mohli chtít, aby se ujistil, že tam je alespoň jedno velké písmeno.Můžeme použít regulárních výrazů:
if ($str =~ //) { print "There is an upper case letter\n";}
Tento bude pracovat s latinským ABC, ale nebude odpovídat znaky likeÁÉÍÓÖŐÚÜŰ (horní případě verze áéíóöőúüű) z maďarské ABC,ani jiné zvláštní znaky jako Přehlásky Ä (horní případě verze ä).
alespoň jedno velké písmeno Unicode
pro to existuje \p{velká písmena}, která bude odpovídat přesně jednomu znaku horního caseUnicode. Takže to bude odpovídat některému z těchto:ÄAÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÚÜŰVWXYZ
if ($str =~ /\p{Uppercase}/) { print "There is an upper case Unicode letter\n";}
všechny znaky jsou velká písmena Unicode
nemusí stačit mít jedno velké písmeno.Možná budete potřebovat mít všechny z nich: v tomto případě můžeme použít ^ a $ regex kotvy odpovídat začátku a konci řetězce, resp.
použijeme také kvantifikátor+, který znamená 1 nebo více věcí. V našem případě jeden nebo více z předchozích velkých písmen.
if ($str =~ /^\p{Uppercase}+$/) { print "There is an upper case Unicode letter\n";}
Všechny znaky jsou velká písmena Unicode písmena nebo prostor
samozřejmě, že to je vzácné, že řetězec by se skládat pouze z velkých písmen.někdy chceme také povolit další postavy. Rádi bychom například umožnili i prostory. V tomto případě vytvoříme třídu znaků (v hranatých závorkách), která je vytvořena z mezery a třídy znaků představující všechna velká písmena na světě: .
if ($str =~ /^+$/) { print "There is an upper case Unicode letter\n";}
Snažím příklady
Když se snažíte příklad můžeme buď čtení řetězce ze souboru.V tom případě budeme asi chtít, otevřete soubor pomocí kódování UTF-8 flag enabled:
open(my $fh, '<:encoding(UTF-8)', $filename)
Na druhou stranu, pokud struny mají být ve srovnání jsou v kódu,je třeba přidat use utf8; na začátku skriptu.
V obou případech je doporučeno změnit na standardní výstup channelsto použití utf-8 s následujícím:
use open ':std', ':encoding(utf8)';
Zkuste tento příklad:
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"; }}