existe a função is_upper em Perl, então como podemos verificar se uma cadeia contém caracteres maiúsculos?
a coisa simples é compará-lo com a versão de maiúscula de si mesmo:
if ($str eq uc $str) { print "All the characters are upper case\n";}
mas isso também vai dizer que “123” us all upper case.por vezes, não é disto que precisa.
pelo menos uma letra maiúscula
além de verificar se a versão maiúscula da cadeia é igual a si própria,podemos querer ter a certeza de que há pelo menos uma letra maiúscula.Podemos usar uma regex:
if ($str =~ //) { print "There is an upper case letter\n";}
Isso vai funcionar com o latim ABC, mas não correspondência de caracteres likeÁÉÍÓÖŐÚÜŰ (as maiúsculas versões de áéíóöőúüű) do húngaro ABC nem outros caracteres estranhos como um Trema Ä (as maiúsculas versão ä).
pelo menos uma letra Unicode superior
para isso existe \p{Uppercase} que irá corresponder exactamente a um carácter caseUnicode superior. Assim, irá corresponder a qualquer um destes:ÄAÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÚÜŰVWXYZ
if ($str =~ /\p{Uppercase}/) { print "There is an upper case Unicode letter\n";}
todos os caracteres são letras Unicode maiúsculas
pode não ser suficiente para ter uma letra maiúscula.Você pode precisar de ter todos eles: nesse caso, podemos usar a âncora ^ e $ regex para corresponder ao início e ao fim da string, respectivamente.
também aplicamos o quantificador + que significa 1 ou mais da coisa de precedência. No nosso caso, um ou mais dos casos superiores anteriores.
if ($str =~ /^\p{Uppercase}+$/) { print "There is an upper case Unicode letter\n";}
todos os caracteres são letras Unicode maiúsculas ou espaço
é claro que é raro que uma cadeia consistisse apenas de letras maiúsculas.às vezes também queremos permitir outros personagens. Por exemplo, gostaríamos de permitir espaços também. Neste caso, criamos uma classe de caracteres (entre parêntesis rectos)que é construída a partir de um espaço e a classe de caracteres que representa todas as letras maiúsculas do mundo: .
if ($str =~ /^+$/) { print "There is an upper case Unicode letter\n";}
Tentando exemplos
Ao tentar exemplo, podemos ler as seqüências de caracteres de um arquivo.Nesse caso, irá provavelmente querer toopen o arquivo usando o formato UTF-8 sinalizador activado:
open(my $fh, '<:encoding(UTF-8)', $filename)
por outro lado, se as cadeias de caracteres a ser comparado com o código,é preciso adicionar usar utf8; para o início do script.
Em qualquer dos casos, é recomendável alterar o padrão de saída channelsto usar utf-8 com o seguinte:
use open ':std', ':encoding(utf8)';
Tente este exemplo:
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"; }}