• Publicidad

Obtener código web desde Perl

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

Re: Obtener código web desde Perl

Notapor erv-Z » 2011-05-22 07:37 @359

El error está en el while(), falta otro paréntesis y el corchete.

También un error en my ($precio)=...

Igual creo que estás colocando el while() en el lugar incorrecto. Yo creo que deberías utilizar goto, que sería mejor para este caso.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Publicidad

Re: Obtener código web desde Perl

Notapor explorer » 2011-05-22 11:20 @513

Con solo formatear el código, con la ayuda de perltidy, por ejemplo, ya se aprecian los errores, como el comentado por erv-Z.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!perl
  2.  
  3. use LWP::Simple;
  4.  
  5. print "Introduzca nombre del valor:\n";
  6. $valor = <STDIN>;
  7. print "Introduzca precio de compra:\n";
  8. $compra = <STDIN>;
  9. while (
  10.     $contenido = get(
  11.         "http://bolsaphp.sukiweb.net/api/cv_api.php?usuario=nobo&%20api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&%20ticker=$valor"
  12.     ) my ($precio) = $contenido =~ m/valor>(.+?)</ $precio =~ s/[,]/./;
  13.     ) {
  14.     if ( $precio <= $compra ) {
  15.         get("http://bolsaphp.sukiweb.net/api/cv_api.php?usuario=nobo&api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&ticker=$valor&acciones=25&valor=$compra&tipo_de_orden=LIMITADA&intencion=COMPRA"
  16.         );
  17.     }
  18.     else {
  19.         ( sleep 5 * 60 );
  20.     }
  21. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Te aconsejo que uses un editor de textos con coloreado de sintaxis.

En cuanto a la solución del problema, yo lo haría con un do{}until();, es decir "haz esto-hasta que-se cumpla la condición". O, invirtiendo la condición, haciendo un do{}while();, que equivale a un "haz esto-mientras que-se cumpla la condición".

(no probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!perl
  2.  
  3. use LWP::Simple;
  4.  
  5. ### Constantes
  6. my $URL     = 'http://bolsaphp.sukiweb.net/api/cv_api.php';
  7. my $API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxx';
  8. my $USUARIO = 'nobo';
  9.  
  10. ### Leemos los valores
  11. print "Introduzca nombre del valor:\n";
  12. my $valor = <>;
  13. print "Introduzca precio de compra:\n";
  14. my $compra = <>;
  15.  
  16. ### Quitamos los caracteres de fin de línea
  17. chomp $valor;
  18. chomp $compra;
  19.  
  20. ### Bucle
  21. do {
  22.     ## Leemos valor actual
  23.     my $contenido = get(
  24.         "$URL?" . join('&', "usuario=$USUARIO", "api_key=$API_KEY", "ticker=$valor")
  25.     );
  26.  
  27.     ## Extraemos el precio del valor
  28.     my ($precio) = $contenido =~ m/valor>(.+?)</;
  29.     $precio =~ s/[,]/./;
  30.  
  31.     ## Condición
  32.     if ( $precio > $compra ) {             # si el $precio de venta es superior al de $compra deseada
  33.       sleep 5 * 60;                        # esperamos 5 min
  34.     }
  35.  
  36. } while ($precio > $compra);               # repetimos mientras se cumpla la condición
  37.  
  38. ## Realizar la compra
  39. my $resultado = get(
  40.       "$URL?"
  41.     . join('&',
  42.           "usuario=$USUARIO",
  43.           "api_key=$API_KEY",
  44.           "ticker=$valor",
  45.           "acciones=25",
  46.           "valor=$compra",
  47.           "tipo_de_orden=LIMITADA",
  48.           "intencion=COMPRA"
  49.       )
  50. );
  51.  
Coloreado en 0.002 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: Obtener código web desde Perl

Notapor nobody » 2011-05-22 14:13 @634

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
## Condición
    if ( $precio > $compra ) {             # si el $precio de venta es superior al de $compra deseada
      sleep 5 * 60;                        # esperamos 5 min
    }

} while ($precio > $compra);               # repetimos mientras se cumpla la condición

## Realizar la compra
my $resultado = get(
      "$URL?"
    . join('&',
          "usuario=$USUARIO",
          "api_key=$API_KEY",
          "ticker=$valor",
          "acciones=25",
          "valor=$compra",
          "tipo_de_orden=LIMITADA",
          "intencion=COMPRA"
      )
);
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Esto esta mal, ¿no? Porque las 2 condiciones son iguales... La del if() debería ser al revés, ¿no? Es decir, si el precio del valor es mayor al precio que yo introduje esperar 5 min... porque si no, nunca comprara..., ¿no?

Es decir, yo lo que quiero es si el precio que yo doy de compra es igual o mayor al que se vende la acción "=>" Compra la acción. Si el precio que yo le doy para comprar es menor (por lo tanto la acción está más cara), espera 5 min y vuelve a comprobar el precio... ¿no? Por lo tanto, sería así:


## Condición
if ( $precio < $compra ) { # si el $precio de venta es superior al de $compra deseada
sleep 5 * 60; # esperamos 5 min
}

} while ($precio => $compra); # repetimos mientras se cumpla la condición

## Realizar la compra
my $resultado = get(
"$URL?"
. join('&',
"usuario=$USUARIO",
"api_key=$API_KEY",
"ticker=$valor",
"acciones=25",
"valor=$compra",
"tipo_de_orden=LIMITADA",
"intencion=COMPRA"
)
);

PD: Utilizo perleditor, ¿ cuál me recomiendas ?
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Re: Obtener código web desde Perl

Notapor explorer » 2011-05-22 15:13 @676

nobody escribiste:Si el precio que yo le doy para comprar es menor (por lo tanto la acción está más cara), espera 5 min y vuelve a comprobar el precio... ¿no?
El programa está bien.

$precio es el valor actual de la acción
$compra es el precio al que queremos comprar la acción.

La condición

if ($precio > $compra) {
sleep 5*60;
}

quiere decir: si el $precio de la acción es-mayor-que el valor de $compra indicada, esperamos 5 min. Y a continuación,

while ($precio > $compra);

quiere decir: repite el bucle mientras el $precio de la acción siga siendo mayor que el precio al que le quiero comprar.

Suena un poco raro el ver dos condiciones iguales y seguidas, pero es lo que estás diciendo: "Si el precio que yo le doy para comprar es menor (por lo tanto la acción está más cara), espera 5 min _y_ vuelve a comprobar el precio".

nobody escribiste:Por lo tanto, sería así:

## Condición
if ( $precio < $compra ) { # si el $precio de venta es superior al de $compra deseada
sleep 5 * 60; # esperamos 5 min
}

} while ($precio => $compra); # repetimos mientras se cumpla la condición
Fíjate que has equivocado lo que quieres decir en la condición, con lo que estás escribiendo en el comentario...

Y el operador de comparación '=>' no existe en Perl. Se escribe así: '>='

nobody escribiste:PD: Utilizo perleditor, ¿ cuál me recomiendas ?
Si estás en Windows, es bastante bueno. Yo he usado Notepad++, Komodo y Eclipse+e-p-i-c. El más fácil y rápido de instalar es Notepad++, desde luego, pero es solo eso, un editor. En cambio, Komodo y Eclipse+e-p-i-c son capaces de ejecutar y depurar programas. Komodo era de pago, pero tenía una versión recortada, que era gratuita. ¡Ah!, y Padre.
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: Obtener código web desde Perl

Notapor nobody » 2011-05-23 04:02 @210

Y entonces, ¿cuando sea menor saltará a la compra?

Pensé que tenía que especificar cuándo quería comprar pero si lo entendí bien, no hace falta... ¿no? Porque ya se le está diciendo que cuando se rompa esa condición, realice la compra.
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Re: Obtener código web desde Perl

Notapor explorer » 2011-05-23 04:30 @229

Esta es otra versión, por si te parece más fácil.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!perl
  2.  
  3. use LWP::Simple;
  4.  
  5. ### Constantes
  6. my $URL     = 'http://bolsaphp.sukiweb.net/api/cv_api.php';
  7. my $API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxx';
  8. my $USUARIO = 'nobo';
  9.  
  10. ### Leemos los valores
  11. print "Introduzca nombre del valor:\n";
  12. my $valor = <>;
  13. print "Introduzca precio de compra:\n";
  14. my $compra = <>;
  15.  
  16. ### Quitamos los caracteres de fin de línea
  17. chomp $valor;
  18. chomp $compra;
  19.  
  20. ### Bucle infinito
  21. while (1) {
  22.     ## Leemos valor actual
  23.     my $contenido = get(
  24.         "$URL?" . join('&', "usuario=$USUARIO", "api_key=$API_KEY", "ticker=$valor")
  25.     );
  26.  
  27.     ## Extraemos el precio del valor
  28.     my ($precio) = $contenido =~ m/valor>(.+?)</;
  29.     $precio =~ s/[,]/./;
  30.  
  31.     ## Si el $precio de la acción es menor que el precio de $compra indicado
  32.     if ( $precio <= $compra ) {
  33.         my $resultado = get( "$URL?" . join('&',             # Realizamos la compra,
  34.             "usuario=$USUARIO", "api_key=$API_KEY", "ticker=$valor",
  35.             'acciones=25', "valor=$compra",
  36.             'tipo_de_orden=LIMITADA', 'intencion=COMPRA'
  37.             )
  38.         );
  39.         exit;                                                # y terminamos el programa
  40.     }
  41.  
  42.     sleep 5 * 60;                        # esperamos 5 min para intentarlo otra vez
  43. }
  44.  
Coloreado en 0.002 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: Obtener código web desde Perl

Notapor nobody » 2011-05-25 14:19 @638

Pues sí, más fácil. Me gusta lo de definir antes las variables... Me has dado una idea, ¡je,je,je! Puedo hacer que se indique el usuario y la API al principio del programejo :D por stdin ;)

Voy a digerir el código que no me va lo de pegar y copiar, las dudas que tenga las voy posteando ;)

Muchas gracias y os pondré la página en los créditos del programa :p

EDITO:
En el while (1) ¿Por qué el "1"?
En las constantes, ¿las comillas serian dobles (para win2)?
otra cosa... ¿Por qué pones en las variables "<>"?
El chomp(), yo no lo usaba y funcionaba. ¿Es totalmente necesario? ¿O es para evitar futuros problemas?
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Re: Obtener código web desde Perl

Notapor explorer » 2011-05-25 15:09 @673

nobody escribiste:En el while (1) ¿Por qué el "1"?
while() necesita una condición. Necesitamos darle una condición que sea siempre verdadera para que el bucle sea infinito. El "1" es una expresión que siempre es verdadera (a diferencia de "0", que siempre es falsa). Pero también puedes usar la cadena "forever" o la "felices para siempre". De hecho, puedes usar cualquier cadena que no sea "0" o "" (la vacía).

nobody escribiste:En las constantes, ¿las comillas serían dobles (para win2)?
Las comillas importan, según el sistema operativo, si escribimos código Perl en la línea de comandos. Dentro de un programa, no importan. Bueno, sí... pero de otra manera: las dobles comillas realizan interpolación, mientras que las simples, no. (Más información en perldoc perlsyn)

nobody escribiste:otra cosa... ¿Por qué pones en las variables "<>"?
"<>" es lo mismo que "<STDIO>", es decir, leer desde la entrada estándar. Queda más corto...

nobody escribiste:El chomp(), yo no lo usaba y funcionaba. ¿Es totalmente necesario? ¿O es para evitar futuros problemas?
Ya que vas a mandar información en una URL, es mejor quitarlos.
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: Obtener código web desde Perl

Notapor nobody » 2011-05-25 15:33 @690

Es decir, podría poner cualquier cosa dentro de los "()" del while(), ¿no? Menos 0... ¿0 representa el negativo? Pensaba que era "~" delante de la comparación :S

Voy a seguir investigando ;)
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Re: Obtener código web desde Perl

Notapor explorer » 2011-05-25 17:29 @770

En perldoc perlsyn, en la sección Truth and Falsehood (Verdad y Falsedad) se indican los valores que son verdaderos y falsos, en Perl.

Es muy fácil: en Perl solo hay cuatro valores que sean "falsos". Los demás, son verdaderos.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 28 invitados