• Publicidad

¿sustitución?

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

¿sustitución?

Notapor Anthares » 2007-04-30 07:22 @349

:cry: Hola estoy necesitando ayuda, quiero hacer lo siguiente

Tengo un vector donde cada elemento es un string y quiero sustituir en todos los elementos de dicho vector la ocurrencia de un patrón por otra cosa usando una expresión regular,
¿Alguien me puede tirar una idea de como hacerlo? ¡Gracias a quien pueda! :roll: :roll:
Anthares
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2007-04-30 07:18 @346

Publicidad

Notapor explorer » 2007-04-30 09:31 @438

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

Eso se hace muy fácil: haces un foreach por todos los elementos del vector y luego llamas a la función de reemplazo. Vamos, tres líneas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach ( @vector ) {
   s/algo/por otra cosa/;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Anthares » 2007-04-30 10:59 @499

Muchas gracias, pero aun tengo un problema que no puedo solucionar y me tiene a mal traer :x

El problema es el siguiente:

Tengo en un archivo de texto lo siguiente

Código: Seleccionar todo
hijo = Ernesto
edad = 23


yo luego leo de dicho archivo la primera línea que es "hijo = Ernesto" usando

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$temp = <>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


luego quiero hacer una sustitución sobre $temp de manera que quede así

Código: Seleccionar todo
"Ernesto"


es decir, se elimine "hijo = " (incluyendo el espacio después del igual).

Para eso hago esto

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   $temp=~ s/[^=]*=\s(.*)/\1/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Supuesta mente le estoy diciendo que elimine todo lo que está antes del igual incluyendo el igual y el espacio inmediato y lo cambie por todo lo que esta después de eso pero sin el fin de línea.

El problema está en que cuando hago

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print ("$temp  hola ");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


se imprime "Ernesto" en un línea y en otra línea hola, cuando tendría que hacerse todo en una línea. Es como que quedara el fin de línea.

¿Alguien me puede sacar de este poso depresivo?
:cry:

Muchas gracias :roll:
Anthares
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2007-04-30 07:18 @346

Notapor explorer » 2007-04-30 11:21 @515

Efectivamente... el fin de línea sigue allí.

La expresión regular lo mete dentro de los paréntesis de captura.

Como ya se ha comentado por aquí, la forma (.*) es muy glotona. Y peligrosa.

Una forma de evitarlo es reescribiendo la expresión regular para que no admite el carácter fin de fichero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$temp =~ s/[^=]*=\s(.*)\s*/\1/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Así, decimos que después de la palabra que estamos capturando con los paréntesis, pueden venir 0 o más caracteres de tipo espacio (incluyendo el carácter (o caracteres) de fin de línea).

Otra forma, la recomendada, es que dado que todas las líneas que vamos a leer del fichero tienen ese carácter, lo quitaremos nada más terminar de leer la línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
chomp( $temp = <> );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y, otra más, por ejemplo, es hacer una expresión regular que nos extraiga el contenido que queremos: la última palabra de la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$temp =~ /(\w+)$/;
print "$1 hola\n":
# O así
($hijo) = $temp =~ /(\w+)$/;
print "$hijo hola\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Anthares » 2007-04-30 12:16 @552

Muchisimas pero muchisimas gracias ¡¡¡¡¡¡¡¡¡¡¡ :D ya me siento mejor, ahora hace lo que tiene que hacer ¡¡¡¡

nueva mente gracias :wink:
Anthares
Perlero nuevo
Perlero nuevo
 
Mensajes: 26
Registrado: 2007-04-30 07:18 @346


Volver a Básico

¿Quién está conectado?

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

cron