Perl es un lenguaje muy potente para el procesado de textos. Pero además de su rica sintaxis, Perl cuenta con una herramienta muy poderosa: las expresiones regulares.
Las expresiones regulares buscan patrones, y por cada uno de ellos, podemos pedirle que haga algo.
En tu caso, buscas las palabras que empiecen con vocal y cambiarlas por la misma palabra en mayúscula.
Eso se puede hacer así:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict
;
use warnings
;
use utf8
;
use open OUT
=> ':locale';
use POSIX
qw(locale_h
);
setlocale
(LC_CTYPE
, "es_ES");
my $frase = "
En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho
tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua,
rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón
las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún
palomino de añadidura los domingos, consumían las tres partes de su hacienda.
El resto della concluían sayo de velarte, calzas de velludo para las fiestas
con sus pantuflos de lo mismo, los días de entre semana se honraba con su
vellori de lo más fino. Tenía en su casa una ama que pasaba de los cuarenta, y
una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que así
ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro hidalgo
con los cincuenta años, era de complexión recia, seco de carnes, enjuto de
rostro; gran madrugador y amigo de la caza. Quieren decir que tenía el
sobrenombre de Quijada o Quesada (que en esto hay alguna diferencia en los
autores que deste caso escriben), aunque por conjeturas verosímiles se deja
entender que se llama Quijana; pero esto importa poco a nuestro cuento; basta
que en la narración dél no se salga un punto de la verdad.";
$frase =~ s/\b([aeiou]\w+)/uc($1)/ge;
print "$frase\n";Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Sale:
- Código: Seleccionar todo
En UN lugar de la Mancha, de cuyo nombre no quiero ACORDARME, no ha mucho
tiempo que vivía UN hidalgo de los de lanza EN ASTILLERO, ADARGA ANTIGUA,
rocín flaco y galgo corredor. Una OLLA de ALGO más vaca que carnero, salpicón
las más noches, duelos y quebrantos los sábados, lentejas los viernes, ALGÚN
palomino de AÑADIDURA los domingos, consumían las tres partes de su hacienda.
El resto della concluían sayo de velarte, calzas de velludo para las fiestas
con sus pantuflos de lo mismo, los días de ENTRE semana se honraba con su
vellori de lo más fino. Tenía EN su casa UNA AMA que pasaba de los cuarenta, y
UNA sobrina que no llegaba a los veinte, y UN mozo de campo y plaza, que ASÍ
ENSILLABA EL rocín como tomaba la podadera. Frisaba la EDAD de nuestro hidalgo
con los cincuenta AÑOS, ERA de complexión recia, seco de carnes, ENJUTO de
rostro; gran madrugador y AMIGO de la caza. Quieren decir que tenía EL
sobrenombre de Quijada o Quesada (que EN ESTO hay ALGUNA diferencia EN los
AUTORES que deste caso ESCRIBEN), AUNQUE por conjeturas verosímiles se deja
ENTENDER que se llama Quijana; pero ESTO IMPORTA poco a nuestro cuento; basta
que EN la narración dél no se salga UN punto de la verdad.
Hay que notar en el programa las líneas que hay al principio:
- use utf8: en este programa, los acentos que hay escritos en él, lo están con codificación utf8. Yo uso esa codificación en mi terminal de línea de comandos y en mis editores de texto. Si no hubiera acentos en ninguna parte del programa, esta línea sobraría.
- use open OUT => ':locale' tenemos que indicar que todo el texto que va a salir por la salida estándar lo va a hacer en el sistema de codificación que indiquemos o, por defecto, el que indique el sistema. En mi sistema, debería tener una variable del entorno como esta: LC_ALL, con el valor 'es_ES.UTF-8', para indicar que deseo usar la codificación de caracteres utf8. Pero como no lo tengo, entonces necesito poner además las dos líneas siguientes. Si no uso esta línea, Perl sacará todo el texto codificado como ISO-8859-1.
- use POSIX qw(locale_h): necesito cargar este módulo para usar la siguiente línea.
- setlocale(LC_CTYPE, "es_ES"): como he dicho antes, como no tengo indicado en el sistema qué codificación estoy usando, tampoco estoy indicando cómo es la colección de letras de mi idioma. Si tuviera puesta la variable de entorno LC_ALL puesta a 'es_ES' entonces me bastaría con un 'use locale;'. Con estas dos líneas me aseguro de que el programa entiende exactamente que colección de caracteres quiero usar.
Todo esto es necesario para solo un detalle: que la expresión regular tenga en cuanta a los caracteres acentuados como parte del alfabeto normal (
\w), y no como caracteres extraños.
Naturalmente, también se puede hacer como dices: recorres todo el texto, palabra a palabra (las separas con split() usando el espacio en blanco como separador); compruebas si empiezan con mayúscula, si es así; las "subes" con uc(); lo guardas todo en un arreglo o lo imprimes directamente, con los espacios de nuevo puestos, con un join(), por ejemplo.