Er is function is_upper in Perl, dus hoe kunnen we controleren of een string alleen hoofdletters bevat?
Het is eenvoudig om het te vergelijken met de hoofdletterversie van zichzelf:
if ($str eq uc $str) { print "All the characters are upper case\n";}
maar dit zal ook zeggen dat “123” ons allemaal hoofdletters.
soms is dit niet wat je nodig hebt.
ten minste één hoofdletter
naast het controleren of de hoofdletterversie van de tekenreeks gelijk is aan zichzelf,willen we er misschien voor zorgen dat er ten minste één hoofdletter is.We kunnen een regex gebruiken:
if ($str =~ //) { print "There is an upper case letter\n";}
Dit zal werken met het Latijnse ABC, maar zal niet overeenkomen met karakters alseáéíóöőúüű (de hoofdletterversies van áéíóöőúüű) van het Hongaarse ABC,noch met andere vreemde karakters zoals een Umlaut Ä (de hoofdletterversie van ä).
ten minste één hoofdletter Unicode
daarvoor is er \P{hoofdletters} die exact overeenkomt met één hoofdletter caseUnicode. Dus het komt overeen met een van deze:ÄAÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÚÜŰVWXYZ
if ($str =~ /\p{Uppercase}/) { print "There is an upper case Unicode letter\n";}
Alle karakters zijn hoofdletters Unicode-letters
Het is misschien niet genoeg om één hoofdletter te hebben.Het kan nodig zijn om ze allemaal te hebben:In dat geval kunnen we de ^ en $ regex anker gebruiken om respectievelijk het begin en het einde van de string te matchen.
We passen ook de + – waardegever toe die 1 of meer van het preceding-ding betekent. In ons geval een of meer van de voorafgaande hoofdletters.
if ($str =~ /^\p{Uppercase}+$/) { print "There is an upper case Unicode letter\n";}
alle tekens zijn hoofdletters Unicode-letters of spatie
natuurlijk is het zeldzaam dat een tekenreeks alleen uit hoofdletters bestaat.soms willen we ook andere personages toestaan. We zouden bijvoorbeeld ook ruimte willen toestaan. In dit geval maken we een karakterklasse (tussen vierkante haakjes)die is opgebouwd uit een spatie en de karakterklasse die alle hoofdletters in de wereld vertegenwoordigt: .
if ($str =~ /^+$/) { print "There is an upper case Unicode letter\n";}
de voorbeelden proberen
wanneer we het voorbeeld proberen kunnen we ofwel de tekenreeksen van een file.In in dat geval zullen we waarschijnlijk het bestand willen openen met de UTF-8 vlag ingeschakeld:
open(my $fh, '<:encoding(UTF-8)', $filename)
aan de andere kant, als de te vergelijken tekenreeksen in de code staan,moet men gebruik utf8; toevoegen aan het begin van het script.
in beide gevallen wordt aanbevolen om de standaard uitvoerkanalen als volgt te wijzigen om utf-8 te gebruiken:
use open ':std', ':encoding(utf8)';
probeer dit voorbeeld:
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"; }}