• Publicidad

Problema con cadena

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

Problema con cadena

Notapor natxo » 2007-12-07 08:12 @383

Tengo un script que se conecta a la página de voipbuster.com con mi usuario y clave de acceso. Todo va bien. Lo que hago luego es bajarme la página a un archivo temporal y la proceso buscando información que me interesa.

¿Y qué me interesa? pues saber el estado de la cuenta, claro. En el código HTML está así:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. Remaining credit:<br> 
  2. <span id="balanceid"><b>&euro;&nbsp;10.00</b></span>&nbsp;<span class="buy">(<a href="buy_credit.php" class="buy">buy more</a></sp 
  3. an>) 


El código que uso es éste (la variable $tmp está definida y se refiere al archivo temporal con la página web):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
die "$!" unless open(HTML, $tmp);
while(<HTML>) {
     if ( $_ =~ m/.*balanceid.*(\d+)\.(\d+).*/ ) {
         print "$&\n";
         print "Saldo voipbuster: EUR $1.$2\n";
         last;
    }
}
close(HTML);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y cuando ejecuto el script me dice:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
$ voipbuster.pl
<span id="balanceid"><b>&euro;&nbsp;10.00</b></span>&nbsp;<span class="buy">(<a href="buy_credit.php" class="buy">buy more</a></span>)
Saldo voipbuster: EUR 0.00
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


el print"$&\n" lo puse para comprobar que sí encontraba el saldo correcto. Lo que no entiendo es por qué no me da el resultado esperado de 10.00. Es una chorrada, pero no lo veo.

¿Alguna pista?
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Publicidad

Notapor explorer » 2007-12-07 08:53 @412

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

El problema está en el operador avaricioso '.*' que está justo detrás de la palabra 'balanceid'.

Resulta que ese operador 'se come' el '1', dejando el siguiente '0' al primer par de paréntesis de captura. Luego lo demás funciona bien (el segundo par de paréntesis captura correctamente el '00').

Para verlo más claro, si en el HTML cambiamos el '10.00' por '12.34', lo que sale en pantalla es: EUR 2.34.

Bien, para evitar esto, hay que decirle a ese operador que no sea tan glotón. Que tiene que pararse en el primer dígito para que se lo quede el primer par de paréntesis (mejor dicho, que lo capture el '\d+').

Prueba con esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open HTML, "<$tmp" or die "$!\n";
while ( <HTML> ) {
    if ( m/balanceid.*?(\d+\.\d+)/ ) {
        print "$&\n";
        print "Saldo voipbuster: EUR $1\n";
        last;
    }
}
close HTML;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El único cambio importante es convertir al glotón en un comedido (.*?). Así, se parará en el primer dígito, porque es lo que viene a continuación en la expresión regular.

Observa también que he quitado los '.*' al principio y final, porque no son necesarios: la palabra 'balanceid' es suficiente como 'ancla' para saber dónde está la cantidad.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron