• Publicidad

Cambiar a mayúsculas las palabras que empiecen con vocal

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cambiar a mayúsculas las palabras que empiecen con vocal

Notapor connie » 2009-04-26 21:39 @944

Hola.
Necesito saber cómo se hace para cambiar en un texto solo las palabras que empiecen con vocal.

Gracias.
connie
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-04-26 21:35 @941

Publicidad

Notapor darkborrego » 2009-04-27 02:29 @145

Pues con expresiones regulares.
De memoria no lo sé pero si buscas, seguro que encuentras todo lo que necesitas.
darkborrego
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2009-04-24 12:49 @576

Notapor explorer » 2009-04-27 03:54 @204

Bienvenido a los foros de Perl en Español, connie.

Para pasar a mayúsculas te vale usar la función uc().

Para saber si empieza por vocal, puedes usar if() mirando por la primera letra de la cadena, o usar una expresión regular como esta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$variable =~ m/^[aeiou]/i;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La expresión regular indica que buscamos, al principio (^) de la $variable, una de las letras 'a', 'e', 'i', 'o' o 'u', tanto si está en mayúsculas o minúsculas (/i).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor connie » 2009-04-27 10:43 @488

¿Podría ser con un ejemplo?
connie
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-04-26 21:35 @941

Notapor explorer » 2009-04-27 11:19 @513

Pues...

Usar la función uc() sería así: uc($variable);

Y de la expresión regular, pues la indicada antes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor connie » 2009-04-27 11:46 @532

Gracias, serés muy amable, en contestarme.

La pregunta debería ser:

Tengo en una variable una frase me piden cambiar las que empiecen con vocales a mayúsculas. Tengo las funciones, pero ¿debería la frase separarla con un split() o con un join() e ir pegando frase por frase?
connie
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-04-26 21:35 @941

Notapor explorer » 2009-04-27 19:19 @846

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í:
Sintáxis: [ Descargar ] [ Ocultar ]
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.002 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.
Última edición por explorer el 2009-06-22 09:45 @447, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor connie » 2009-04-28 07:32 @355

Hola.

Gracias por tu respuesta, te pasaste
me quedo super claro.

Pero, ¿sabes? me falta algo.

Hacer lo mismo pero con palabras que terminen en un número.

Chao y gracias
connie
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-04-26 21:35 @941

Notapor explorer » 2009-04-28 08:08 @381

Solo tienes que cambiar la expresión regular... ¡Adelante!
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor connie » 2009-04-28 09:05 @420

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$frase =~ s/\z([0-9]\w+)/uc($1)/ge;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pensé que será así pero no me resulta.
connie
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-04-26 21:35 @941

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 34 invitados