• 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.

Re: Mi primer programa en Perl

Notapor explorer » 2013-10-17 09:40 @444

¡Ah, vaya...! No me había dado cuenta de que se trata de un arreglo de números...

Pero... no es lo mismo hacer un bucle por todos ellos, ejecutando uno cada vez:

/usr/bin/php-cgi /www/midominio/folder/myscript.php?id=10
/usr/bin/php-cgi /www/midominio/folder/myscript.php?id=13
/usr/bin/php-cgi /www/midominio/folder/myscript.php?id=19

que hacer lo que tienes escrito en el código:

if /usr/bin/php-cgi "${urls[@]}"

eso lo que hace es expandir todos los valores del arreglo $urls, con lo que queda en una sola llamada de php-cgi y con todos los argumentos pasados de golpe (ahora mismo no sé si php-cgi ejecutará todos ellos, o solo el primero).

Si, suponemos, que lo que quieres es la primera opción, te vale con un

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $id ( 10, 13, 19, 20, 23, 24, 26, 27, 29, 32, 34, 37, 52, 53, 83 ) {
  2.     system("/usr/bin/php-cgi /home/user/www/folder/script.php?id=$id");
  3.  
  4.     if ( $? == -1 ) {
  5.         print "ERROR: Fallo en la ejecución: $!\n";
  6.     }
  7.     else {
  8.         my $resultado = $? >> 8;                        # nos quedamos con el byte alto
  9.  
  10.         if ($resultado > 0) {
  11.             print "$id : EXITOSO\n";
  12.         }
  13.         else {
  14.             print "$id : FALLIDO\n";
  15.         }
  16.     }
  17. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Cosa muy distinta es hacer una sola llamada a php-cgi y pasarle todos los argumentos de golpe... No sé muy bien cuál de los dos comportamientos quieres que tenga...
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

Publicidad

Re: Mi primer programa en Perl

Notapor ajdm1973 » 2013-10-17 15:57 @706

Saludos, amigo.

Te cuento que he logrado hacer lo que necesitaba. Ahora estoy en lo que pareciera ser lo más sencillo que es cómo ejecutar el cgi-php, fíjate cómo me está quedando el código:
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.         seek(BANDERA,$valor,0);
  7.         print BANDERA "1";
  8.         $urlp="/www/miportal/myscript.php dpto=";
  9.         @urls=(10,13,19,20,23,24,26,27,29,32,34,37,52,53,83,87,92,93);
  10.         $l=@urls;
  11.         foreach ($i; $i<$l; $i++)
  12.          {
  13.            /usr/bin/php-cgi ($urlp@urls[$i]);
  14.            JUSTO AQUI ES DONDE ME ESTÁ DANDO ERROR; PODRIAS DECIRME COMO HAGO PARA LLAMAR AL CGI-PHP
  15.          }
  16.         seek(BANDERA,$valor,0);
  17.         print BANDERA "0";
  18. }
  19. else {
  20.         print "NO EJECUTAR\n";
  21. }
  22. close (BANDERA);
  23.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


De ante mano, 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-17 16:19 @721

Fíjate en mi último mensaje, y verás el 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-18 08:27 @394

Muchisimas gracias, amigo.

Probaré el programa y te comentaré cómo me fue.

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

Re: Mi primer programa en Perl

Notapor ajdm1973 » 2013-10-21 15:05 @670

Saludos amigo.

Antes que todo quiero de nuevo agradecerte la enorme ayuda que me has brindado para la solución de este caso.

Estoy estudiando el código y hay algo que no tengo claro y me gustaría saber si me puedes aclarar la duda. Exactamente, ¿qué hace esta validación?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.            if ( $? == -1 )
  2.              {
  3.                print "ERROR: Fallo la actualizacion $!\n";
  4.              }
  5.            else
  6.              {
  7.                my $resultado = $? >> 8;
  8.                if ($resultado > 0)
  9.                  {
  10.                     print "$idsec : EXITOSO\n";
  11.                  }
  12.                else
  13.                  {
  14.                     print "$idsec : FALLIDO\n";
  15.                  }
  16.              }
  17.         }
  18.  
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como puedes ver estoy mandando a imprimir el valor de la variable resultado pues en todos los casos la actualización me da error FALLIDO.

Entonces, quería saber exactamente qué evalúas allí.

De antemano, 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-21 18:37 @817

El código está sacado del ejemplo propuesto en perldoc -f system:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
            Si desea inspeccionar manualmente el error de "system", puede
            comprobar todas las posibles causas del error mediante la
            inspección de $? como esto:

                if ($? == -1) {
                    print "error al ejecutar: $!\n";
                }
                elsif ($? & 127) {
                    printf "hijo muerto con señal %d, %s coredump\n",
                        ($? & 127),  ($? & 128) ? 'con' : 'sin';
                }
                else {
                    printf "hijo terminó con valor %d\n", $? >> 8;
                }
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La variable especial $? almacena el valor del resultado de la última ejecución de system (más información en perldoc perlvar). Según lo que contenga, nos dirá qué es lo que ha pasado en la ejecución.

Si el resultado es un -1, no se ha podido ejecutar nada. El mensaje de error estará almacenado en $! (más información en perldoc perlvar).

Si no es así, entonces se ha podido ejecutar. El resultado de $? será un código almacenado en dos bytes.

El byte más bajo guarda la -posible- señal que hizo terminar bruscamente el programa (en caso de que el programa recibiera una señal de interrupción).

Para saber ese valor, usamos la operación lógica AND: '$? & 127'. 127 son 7 bits puestos a '1': 0b01111111, así que la operación está extrayendo, del byte bajo de $?, sus 7 primeros bits. Si hay algo ahí, el elsif() se activa y se nos informa que el proceso hijo (el system) ha sido matado por una señal, y nos dice qué señal ha sido.

Si no es así, entonces estamos ante una ejecución normal: el proceso se arrancó y terminó bien. El resultado de la ejecución (no la salida) se almacena en el byte alto de $?. Usamos el operador de desplazamiento de bits a la derecha '>>', 8 veces. El resultado es que el byte alto se coloca en la posición del byte bajo, es decir, que de forma efectiva hemos extraído el valor del byte alto. Y eso es lo que se nos muestra en el mensaje.

En el código de tu programa, he sustituido esta última parte con algo más simplificado, para, sencillamente, ver si el $resultado de la ejecución devuelve un valor positivo (mayor que cero) o no. Si es positivo, devuelve EXITOSO. Si es cero, FALLIDO.

Dices que te salen todos los mensajes como FALLIDOS. Quizás la interpretación del resultado de la ejecución no sea la correcta.

Quiero decir: en los sistemas UNIX, cuando un programa se ha ejecutado de forma correcta, siempre devuelve un valor 0. Y es cuando el resultado es distinto de 0 cuando quiere decir que algo -extraño- ha pasado o no ha salido bien.

¿Estás seguro de lo que devuelve php-cgi?
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-22 10:55 @496

Excelente explicación, explorer.

Muchísimas gracias por la aclaratoria, te cuento que el resultante del php-cgi:
83 : FALLIDO
X-Powered-By: PHP/5.4.20
Content-type: text/html

Ahora el tema sería ver el por qué falla, cómo ver el mensaje de error, ¿existe algún log donde se guarde el detalle del error?
ajdm1973
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2013-10-16 08:08 @381

Re: Mi primer programa en Perl

Notapor explorer » 2013-10-22 11:20 @514

Si php-cgi no genera actividad web ni de ninguna otra clase, pues no hay registro de actividad.

Repito lo de antes: si estoy en un entorno UNIX, y un proceso devuelve 0, la normal dice que entonces el proceso se ha ejecutado de forma normal.

Pero en tu programa, lo estás considerando al revés (0 es fallo).

Todo depende de lo que haga myscript.php. Y no lo sabemos porque no nos lo has dicho.
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

Anterior

Volver a Básico

¿Quién está conectado?

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