Página 4 de 5

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-22 07:37 @359
por erv-Z
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.

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-22 11:20 @513
por explorer
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

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-22 14:13 @634
por nobody
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 ?

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-22 15:13 @676
por explorer
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.

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-23 04:02 @210
por nobody
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.

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-23 04:30 @229
por explorer
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

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-25 14:19 @638
por nobody
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?

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-25 15:09 @673
por explorer
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.

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-25 15:33 @690
por nobody
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 ;)

Re: Obtener código web desde Perl

NotaPublicado: 2011-05-25 17:29 @770
por explorer
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.