C’è la funzione is_upper in Perl, quindi come possiamo controllare se una stringa contiene solo caratteri maiuscoli?
La cosa semplice è confrontarlo con la versione maiuscola di se stesso:
if ($str eq uc $str) { print "All the characters are upper case\n";}
ma questo dirà anche che “123” noi tutti maiuscoli.
A volte questo non è ciò di cui hai bisogno.
Almeno una lettera maiuscola
Oltre a verificare se la versione maiuscola della stringa è uguale a se stessa,potremmo essere sicuri che ci sia almeno una lettera maiuscola.Possiamo usare una regex:
if ($str =~ //) { print "There is an upper case letter\n";}
Questo funzionerà con l’ABC latino, ma non corrisponderà a caratteri come áéíóöőúüŰ (le versioni maiuscole di áéíóöőúüü) dall’ABC ungherese,né ad altri strani caratteri come un Umlaut Ä (la versione maiuscola di ä).
Almeno una lettera Unicode maiuscola
Per questo c’è \p{Maiuscolo} che corrisponderà esattamente a un carattere maiuscolo di caseUnicode. Quindi corrisponderà a uno di questi: ÄAÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÜŰVWXYZ
if ($str =~ /\p{Uppercase}/) { print "There is an upper case Unicode letter\n";}
Tutti i caratteri sono lettere Unicode maiuscole
Potrebbe non essere sufficiente avere una lettera maiuscola.Potresti richiedere di averli tutti: in tal caso possiamo usare gli ancoraggi ^ e reg regexper abbinare rispettivamente l’inizio e la fine della stringa.
Applichiamo anche il quantificatore + che significa 1 o più della cosa precedente. Nel nostro caso uno o più caratteri maiuscoli precedenti.
if ($str =~ /^\p{Uppercase}+$/) { print "There is an upper case Unicode letter\n";}
Tutti i caratteri sono lettere Unicode maiuscole o spazio
Ovviamente è raro che una stringa consista solo di lettere maiuscole.a volte vogliamo anche permettere ad altri personaggi. Ad esempio, vorremmo consentire anche gli spazi. In questo caso creiamo una classe di caratteri (tra parentesi quadre)che viene costruita da uno spazio e la classe di caratteri che rappresenta tutte le lettere maiuscole nel mondo: .
if ($str =~ /^+$/) { print "There is an upper case Unicode letter\n";}
Cercando esempi
Quando si tenta l’esempio siamo in grado di leggere le stringhe da un file.In quel caso ci vorranno probabilmente toopen il file utilizzando la codifica UTF-8 flag abilitato:
open(my $fh, '<:encoding(UTF-8)', $filename)
d’altra parte, se le corde a confronto sono nel codice,bisogna aggiungere usare utf8; all’inizio dello script.
In entrambi i casi si consiglia di modificare i canali di output standard per utilizzare utf-8 con quanto segue:
use open ':std', ':encoding(utf8)';
Prova questo esempio:
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"; }}