• Publicidad

Mi primer programa en Perl

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

Mi primer programa en Perl

Notapor ajdm1973 » 2013-10-16 08:31 @396

Buenos días. Saludos a toda la comunidad.

Estoy recien desarrollando mi primer programa en Perl, el cual es un pequeño robot que se ejecutará a través de un cronjob.

Este robot debe hacer lo siguiente:
  1. Abrir un archivo txt llamado bandera
  2. Leer el valor de la primera posición de texto que está dentro del archivo
  3. Si el valor es 1 entonces se debe cambiar en el archivo el valor a 0, cerrar el archivo y se deben ejecutar una serie de sentencias.
De esta manera si el cronjob se dispara de nuevo y el valor de la bandera es 0, entonces el programa finalizará y no sucederá nada.

Por ahora ya tengo resuelto la parte 1 y 2 pero me falta la 3. ¿Podría alguien ayudarme con esto, por favor?

Desde ya, mil gracias...

Mi código es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $bandera="bandera.txt";
  3. open (BANDERA,"+<$bandera") || die "ERROR: No puedo abrir el fichero $bandera\n";
  4. read (BANDERA, $valor, 1);
  5. if ($valor == "1") {
  6.         .. cambiar valor de la bandera a 0
  7.         .. ejecutar las sentencias
  8. }
  9. else {
  10.         .. finalizar el programa
  11. }
  12. close (BANDERA);
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

De nuevo, un millón de gracias por la ayuda.
ajdm1973
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-10-16 08:08 @381

Publicidad

Re: Mi primer programa en Perl

Notapor explorer » 2013-10-16 09:01 @417

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

En vez de read(), yo usaría readline() o el operador diamante (<BANDERA>). Así, no estamos leyendo bytes, sino líneas enteras de texto.

La comparación, dentro del if(), no está correctamente escrita. Usas el operador de comparación numérica '==', pero el segundo argumento lo pones entre comillas dobles. Yo quitaría las comillas.

Para cambiar el valor de la bandera a 0, te vale con hacer un reposicionamiento del puntero del archivo abierto por BANDERA, con un seek(), a la primera posición del archivo (posición 0), y luego le haces un print con un valor 0, a BANDERA.
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: Mi primer programa en Perl

Notapor ajdm1973 » 2013-10-16 09:07 @421

Saludos, explorer.

Muchísimas gracias por la información.

Sería algo mas o menos así?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $bandera="bandera.txt";
  3. open (BANDERA,"+<$bandera") || die "ERROR: No puedo abrir el fichero $bandera\n";
  4. readline (BANDERA, $valor, 1);
  5. if ($valor == 0) {
  6.         print "EJECUTAR\n";
  7.         seek(BANDERA,$valor,0);
  8.         print BANDERA "1";
  9. }
  10. else {
  11.         print "NO EJECUTAR\n";
  12. }
  13. close (BANDERA);
  14.  
  15.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora bien el problema que estoy teniendo es que está entrando siempre en la condicion, de valor == 0, es decir, que a pesar de que el archivo se escribe y coloca la bandera en 1.

Que me puedes decir al respecto?

Gracias mil, de nuevo.
ajdm1973
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-10-16 08:08 @381

Re: Mi primer programa en Perl

Notapor ajdm1973 » 2013-10-16 10:50 @493

Continuando con el avance del script te comento que ya hace la validación de la bandera, es decir, que ya hace la lectura del archivo, validación y escritura; ahora viene la parte donde se deben ejecutar las sentencias pues el valor está en cero (0).

Para ello yo tengo un sh que hace esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. hora=`date +%d"-"%m"-"%y" "%H":"%M`
  2. urlp='/www/midominio/folder/myscript.php?id='
  3. urls=( "$urlp"{10,13,19,20,23,24,26,27,29,32,34,37,52,53,83} )
  4. if /usr/bin/php.cgi "${urls[@]}"; then
  5.     echo "$hora - Act. de registros programados - EXITOSO"
  6.     exit 0
  7. else
  8.     echo "$hora - Act. de registros programados - FALLIDO"
  9.     exit 1
  10. fi
  11. exit
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

¿Cómo hago para llevar ese código a Perl e incluirlo aquí...?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $bandera="bandera.txt";
  3. open (BANDERA,"+<$bandera") || die "ERROR: No puedo abrir el fichero $bandera\n";
  4. $valor = readline (BANDERA);
  5. if ($valor == 0) {
  6.         print "EJECUTAR\n";
  7.         print $valor;
  8.         seek(BANDERA,$valor,0);
  9.         print BANDERA "1";
  10.         # ---AQUÍ IRÍA EL CÓDIGO ANTERIOR----
  11.         seek(BANDERA,$valor,0);
  12.         print BANDERA "0";
  13. }
  14. else {
  15.         print "NO EJECUTAR\n";
  16. }
  17. close (BANDERA);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De nuevo, muchísimas gracias...
ajdm1973
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-10-16 08:08 @381

Re: Mi primer programa en Perl

Notapor explorer » 2013-10-16 13:46 @615

Supongo que podrás llamarlo con system() o con qx().

Más información en perldoc -f system
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: Mi primer programa en Perl

Notapor ajdm1973 » 2013-10-16 14:40 @652

Gracias mil por tu comentario, explorer,

Más que llamarlo lo que quiero es incluir ese código en mi programa Perl.

¿Podrías ayudarme con eso?

Gracias mil, de nuevo.
ajdm1973
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-10-16 08:08 @381

Re: Mi primer programa en Perl

Notapor explorer » 2013-10-16 14:59 @666

Bueno, pues se trata de traducir las instrucciones que están escritas en shell, a Perl.

La hora la puedes sacar con localtime(), y pasada a un sprintf para que quede formateada.

La construcción de urls no la tengo clara (no sé mucho de shell, la verdad). Creo que no es más que concatenar cadenas de caracteres. En ese caso, en Perl se usa el operador concatenación (.).

Luego llamas a php.cgi, así que ahí sí que necesitas el system(). Y comprobar que el resultado es positivo. Ahí hay que recordar que de system() tenemos que quedarnos con solo uno de los dos bytes que nos devuelve.

Y, finalmente, los echo se sustituyen por print o say.
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: Mi primer programa en Perl

Notapor ajdm1973 » 2013-10-16 16:10 @715

explorer escribiste:Supongo que podrás llamarlo con system() o con qx().

Más información en perldoc -f system


La idea es convertir ese código de shell en Perl e insertarlo en mi script de Perl.

Fíjate como lo estoy haciendo.
1.- Declaro la variable urlp la cual contiene la ruta del script que quiero ejecutar
$urlp="/home/user/www/folder/script.php dept=";
2.- Luego en una arreglo tipo lista, concateno la variable urlp con la lista
$urls=($urlp{10,13,19,20,23,24,26,27,29,32,34,37,52,53,83,87,92,93});

¿Esto está bien así para Perl?

¿O lo debo hacer de otra manera?

Tu te preguntarás, porque lo hace así, lo hago de esta manera pues después de ello ejecuto el siguiente if:

if /usr/bin/php-cgi "${urls[@]}"
{
print "EXITOSO";
}
else{
print "FALLIDO";
}

Donde ${urls[@]} tendrá los valores de urlp concatenados con urls; es decir, que en un momento dato el php-cgi ejecutará /home/user/www/folder/script.php dept=10

¿Podrías orientarme con esto?

De nuevo, mil gracias...
ajdm1973
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-10-16 08:08 @381

Re: Mi primer programa en Perl

Notapor explorer » 2013-10-16 17:57 @789

He ejecuta en shell las primeras líneas de ese programa, y me sale esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > urlp='/www/midominio/folder/myscript.php?id='
  2. > urls=( "$urlp"{10,13,19,20,23,24,26,27,29,32,34,37,52,53,83} )
  3. > echo $urls
  4. /www/midominio/folder/myscript.php?id=10
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

O sea, que $urls, al final, solo contiene el primer valor.

¿Tanto jaleo para poner un solo valor?

En Perl sería:

$urls = '/www/midominio/folder/myscript.php?id=' . '10';
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: Mi primer programa en Perl

Notapor ajdm1973 » 2013-10-17 07:07 @338

explorer escribiste:He ejecuta en shell las primeras líneas de ese programa, y me sale esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > urlp='/www/midominio/folder/myscript.php?id='
  2. > urls=( "$urlp"{10,13,19,20,23,24,26,27,29,32,34,37,52,53,83} )
  3. > echo $urls
  4. /www/midominio/folder/myscript.php?id=10
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

O sea, que $urls, al final, solo contiene el primer valor.

¿Tanto jaleo para poner un solo valor?

En Perl sería:

$urls = '/www/midominio/folder/myscript.php?id=' . '10';


Te recuerdo que es mi primer programa en Perl. A ver, te explico que es lo que necesito hacer y entonces tu me dices cómo lo debo hacer.

Esto sería la ejecución de las sentencias:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=10
  2. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=13
  3. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=19
  4. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=20
  5. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=23
  6. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=24
  7. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=26
  8. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=27
  9. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=29
  10. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=32
  11. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=37
  12. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=52
  13. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=53
  14. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=83
  15. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=87
  16. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=92
  17. /usr/bin/php-cgi /www/midominio/folder/myscript.php id=93
  18.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Cual es el problema que yo veo en esto? Es que cada vez que agrego un nuevo id tengo que agregar una línea al programa; entonces que es lo hace mi shell que funciona es que el ejecutar el script cambiando el id esto lo hace a través de las dos sentencias anteriores.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. urlp='/www/midominio/folder/myscript.php?id='
  2. urls=( "$urlp"{10,13,19,20,23,24,26,27,29,32,34,37,52,53,83} )
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Cómo lo harías tu o qué me recomiendas hacer?

Desde ya, gracias y mil disculpas por las molestias.
ajdm1973
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-10-16 08:08 @381

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron