• Publicidad

Guardar carácteres concretos en una variable

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

Guardar carácteres concretos en una variable

Notapor Eowyn » 2011-08-09 09:57 @456

Hola, escribí hace tiempo en este foro y me sirvió de ayuda. Esta vez tengo una duda que creo que es bastante simple.

Tengo un documento de tipo xml, con esta forma

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <text>
  2. <wf wid="w1" sent="s1">Komunikazio</wf>
  3. <wf wid="w2" sent="s1">elektronikoen</wf>
  4. <wf wid="w3" sent="s1">aroan</wf>
  5. <wf wid="w4" sent="s1">egon</wf>
  6. <wf wid="w5" sent="s1">arren</wf>
  7. <wf wid="w6" sent="s1">,</wf>
  8. <wf wid="w7" sent="s1">gero</wf>
  9. <wf wid="w8" sent="s1">eta</wf>
  10. <wf wid="w9" sent="s1">paper</wf>
  11. <wf wid="w10" sent="s1">gehiago</wf>
  12. <wf wid="w11" sent="s1">kontsumitzen</wf>
  13. <wf wid="w12" sent="s1">da</wf>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Necesito conseguir cada valor de wid (el número o el "w1" por ejemplo) y guardarlo en una variable, pero no sé cómo. Es decir:

El programa abre el fichero y mira línea a línea.

Si en alguna línea encuentra la palabra "gero" debe ejecutar lo siguiente:

Al llegar por ejemplo a esta línea: <wf wid="w7" sent="s1">gero</wf> encuentra la palabra "gero" y entonces debe guardar la wid que le corresponda (en este caso "w7") en una variable.

¿Es posible? Agradecería mucho su ayuda y espero se entienda mi explicación.

Acabo de intentarlo con este código:


my $testua='<wf wid="w1" sent="s1">Komunikazio</wf>';

my $numero = grep (/wid(w.*)/, $testua);

print($numero);

pero me imprime el número 0 cuando debería imprimir el "1" de "w1".
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410

Publicidad

Re: Guardar carácteres concretos en una variable

Notapor explorer » 2011-08-09 11:30 @521

Prueba con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $testua = '<wf wid="w1" sent="s1">gero</wf>';
  2.  
  3. my $numero;
  4. if ($testua =~ /gero/i) {                    # ¿está "gero"?
  5.     ($numero) = $testua =~ /wid="(.*?)"/;    # sí, saca el wid
  6. }
  7. print "[$numero]\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

La expresión regular $testua =~ /wid="(.*?)"/ quiere decir que vamos a buscar dentro de $testua por una cadena de caracteres 'wid="', y capturaremos todo lo que haya hasta antes del siguiente carácter '"'. La captura la guardaremos en $numero.

Los paréntesis que rodean a $numero son importantes. Sin ellos, obtendríamos el resultado booleano de la expresión regular (verdadero, si hubo alguna captura; falso, si no), en lugar de la primera captura, que es lo que queremos. Como las capturas se devuelven en contexto lista, pues por eso necesitamos los paréntesis. Otra forma de hacerlo sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     $testua =~ /wid="(.*?)"/;    # sí, saca el wid
  2.     $numero = $1;                # $1 guarda la captura del primer par de paréntesis
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Guardar carácteres concretos en una variable

Notapor Eowyn » 2011-08-09 11:50 @535

¡Funciona!

Mil gracias, me has hecho un gran favor y la explicación es genial.

¡Gracias!
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410


Volver a Básico

¿Quién está conectado?

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