Hay función is_upper en Perl, así que ¿cómo podemos comprobar si una cadena contiene caracteres en mayúsculas?
Lo simple es compararlo con la versión en mayúsculas de sí mismo:
if ($str eq uc $str) { print "All the characters are upper case\n";}
pero esto también dirá que «123» todos nosotros en mayúsculas.
A veces esto no es lo que necesitas.
Al menos una letra mayúscula
Además de comprobar si la versión mayúscula de la cadena es igual a sí misma,es posible que deseemos asegurarnos de que haya al menos una letra mayúscula.Podemos usar una expresión regular:
if ($str =~ //) { print "There is an upper case letter\n";}
Esto funcionará con el ABC latino, pero no coincidirá con caracteres como Áéíóöőúüű (las versiones en mayúsculas de áéíóöőúüű) del ABC húngaro,ni con otros caracteres extraños como un Diéresis Ä (la versión en mayúsculas de ä).
Al menos una letra Unicode mayúscula
Para eso hay \p{Mayúscula} que coincidirá exactamente con un carácter de código de caso superior. Por lo tanto, coincidirá con cualquiera de estos:ÄAÁBCDEÉFGHIÍJKLMNOÓÖPQRSTUÚÜŰVWXYZ
if ($str =~ /\p{Uppercase}/) { print "There is an upper case Unicode letter\n";}
Todos los caracteres son letras Unicode mayúsculas
Puede que no sea suficiente tener una letra mayúscula.Es posible que necesite tener todos ellos:En ese caso, podemos usar los anclajes ^ y reg regex para que coincidan con el principio y el final de la cadena, respectivamente.
También aplicamos el cuantificador + que significa 1 o más de lo que precede. En nuestro caso, uno o más de los caracteres mayúsculas anteriores.
if ($str =~ /^\p{Uppercase}+$/) { print "There is an upper case Unicode letter\n";}
Todos los caracteres están en mayúsculas Unicode letras o espacio
por supuesto, es raro que una cadena solo se componen de letras mayúsculas.a veces también queremos permitir que otros personajes. Por ejemplo, también nos gustaría permitir espacios. En este caso, creamos una clase de caracteres (entre corchetes) que se construye a partir de un espacio y la clase de caracteres que representa todas las letras mayúsculas del mundo: .
if ($str =~ /^+$/) { print "There is an upper case Unicode letter\n";}
Probando los ejemplos
Al probar el ejemplo, podemos leer las cadenas de un file.In en ese caso, probablemente queramos abrir el archivo usando la bandera UTF-8 habilitada:
open(my $fh, '<:encoding(UTF-8)', $filename)
Por otro lado,si las cadenas a comparar están en el código, es necesario agregar use utf8; al principio del script.
En cualquier caso, se recomienda cambiar los canales de salida estándar para usar utf-8 con lo siguiente:
use open ':std', ':encoding(utf8)';
Pruebe este ejemplo:
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"; }}