• Publicidad

Mandar argumentos a otro programa

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

Mandar argumentos a otro programa

Notapor animal collective » 2010-10-17 18:07 @796

Estimados,

Antes que todo me presento, soy un usuario que a utilizado mucho este sitio web, muchos de los problemas que he presentado en mi vida laboral los resolví gracias a este foro, nunca me había visto en la necesidad de postear, ya que mis dudas ya estaban respondidas en el foro.

Les planteo el problema que estoy presentando:

Tengo un script Perl cuya funcionalidad es retornar 6 valores. El primer valor corresponde a un número que va buscar a una base de datos Oracle y los otros 5 valores son números aleatorios.

Si yo ejecuto el script en línea de comandos:

C:\Perl\bin\perl.exe C: \numeros.pl

el script funciona perfecto retornando los 6 valores. El propósito de este script es que sea ejecutado por otra aplicación. Esta aplicación dibuja los valores que retorna el script, pero al configurar esta aplicación para que ejecute el script arroja un error, diciendo que la salida del script es errónea. Si yo le envío 6 números aleatorios a esta aplicación omitiendo el de la base de datos, los dibuja sin problemas.

Mi petición es la siguiente: si pueden analizar mi script e indicarme si la sintaxis es correcta, o si hay alguna forma de ver los errores que puede retornar el código. Como mencioné anteriormente, si yo ejecuto el script en línea de comandos no arroja ningún problema y me trae el valor de la base de datos más los otros 5 valores aleatorios.

A continuación adjunto las dos formas que he intentado realizar el retorno de este valor.

script 1:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\Perl\bin\perl.exe -w
  2. use DBI;
  3. use strict;
  4.  
  5. my $user='dbuser';
  6. my $password='dbconn';
  7. my $host = '190.4.9.5';
  8. my $port= 1531;
  9. my $sid='stergr';
  10.  
  11. my $b=2;
  12. my $c=3;
  13. my $d=4;
  14. my $e=5;
  15. my $f=6;
  16. my $valor;
  17. my $datos;
  18. my $driver;
  19. my $dbh;
  20. my $sth;
  21.  
  22. $driver="dbi:Oracle:host=$host;sid=$sid;port=$port";
  23. $dbh= DBI -> connect("$driver",$user,$password);
  24. $sth = $dbh->prepare("select /*+index (eb_tran_log,eb_tran_logi12)*/count(tran_time) tph from eb_tran_log where tran_time between (sysdate - 3600/(24*60*60)) and (sysdate - 1/(24*60*60)) and device_nbr in (509,510)");
  25. $sth->execute();
  26.  
  27. while(($datos)=$sth->fetchrow_array)
  28. {
  29.        $valor=$datos;
  30. }
  31.  
  32. $sth->finish();
  33. $dbh->disconnect;
  34.  
  35. print("$valor $b $c $d $e $f \n");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


script 2
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\Perl\bin\perl.exe -w
  2.  
  3. use strict;
  4.  
  5. my $var=`sqlplus -S dbuser/dbconn\@TEST1 \@C:\\selectvalor.sql`;
  6. my $val=$var * 1;
  7. my $b=2;
  8. my $c=3;
  9. my $d=4;
  10. my $e=5;
  11. my $f=6;
  12.  
  13. print ("$val  $b $c $d $e $f \n");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Atento a sus comentarios,

¡¡¡¡Muchas Gracias!!!!
animal collective
Perlero nuevo
Perlero nuevo
 
Mensajes: 39
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Publicidad

Re: Mandar argumentos a otro programa

Notapor explorer » 2010-10-17 18:27 @810

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

Yo no veo problema en los programas.

Podría haber un problema si los valores que sacas contienen algún carácter que al programa que los recibe no le guste.

Por ejemplo, si el resultado de la consulta a la base de datos es una cadena de caracteres que contiene algún espacio en blanco, el programa que los recibe puede liarse porque no sabrá dónde empieza o acaba el primer argumento.

Lo mismo si contiene retornos de carro, avances de línea, y cualquier otro carácter que, en la entrada del otro programa, pueda confundirlo.

En el caso más sencillo, si fueran espacios en blanco, valdría con poner comillas dobles alrededor del primer argumento (por estar trabajando en Windows).

El otro programa debería ser un poco más amable, y decir exactamente, qué es lo que no le gusta.
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: Mandar argumentos a otro programa

Notapor animal collective » 2010-10-17 18:53 @829

Explorer,

gracias por tu pronta respuesta.

Te comento algunas cosas: el valor que extraigo de la base de datos es un número, pero tiene espacios en blanco. Yo lo multiplico por 1 para eliminar los espacios y me entregue un número. No sé si este procedimiento de multiplicarle un 1 esté bien.

¿Existe alguna forma de realizar un análisis y trasformar ese valor en entero?

explorer escribiste:En el caso más sencillo, si fueran espacios en blanco, valdría con poner comillas dobles alrededor del primer argumento (por estar trabajando en Windows).

¿Te refieres a realizar esto?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print ("$val” “$b $c $d $e $f \n");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias por tu tiempo
sos un crack
animal collective
Perlero nuevo
Perlero nuevo
 
Mensajes: 39
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Re: Mandar argumentos a otro programa

Notapor explorer » 2010-10-17 19:06 @837

En lugar de poner

my $val = $var * 1;

ponlo así:

my $val = 0 + $var;

La operación es la misma, pero tradicionalmente se suele hacer con el '0'.

Cuidado con las comillas... las que estás mostrando no son auténticas comillas dobles... han de ser estas: " . No ninguna de estas: ', “, ”. Y las comillas que están dentro de otras comillas dobles, deben ser escapadas con '\'.

Pero si el primer argumento es un número, entonces no debería hacer falta.

Para estar seguros, cambia el print() del programa, colocando cada argumento entre corchetes, así:

# print "$valor $b $c $d $e $f\n";
print "[$val] [$b] [$c] [$d] [$e] [$f]\n";


Así verás si hay caracteres extraños en los argumentos. Luego, intercambias las dos líneas, y pruebas con el otro programa.

¿Cómo le pasas estos argumentos al otro programa?
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: Mandar argumentos a otro programa

Notapor animal collective » 2010-10-17 19:34 @857

A la aplicación le ingreso la ruta donde está el script:
C:\Perl\bin\perl.exe C: \numeros.pl

Como te comenté anteriormente, si retorno 6 valores, fijo la aplicación sí hace el gráfico. El problema es cuando envió el valor de la base de datos.

Mañana realizaré la prueba que me recomendaste, ya que desde mi hogar no tengo acceso a la aplicación.

Gracias por tu tiempo, amigo.
animal collective
Perlero nuevo
Perlero nuevo
 
Mensajes: 39
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Re: Mandar argumentos a otro programa

Notapor explorer » 2010-10-18 04:41 @236

Sí, esa es la manera en que ejecutas el programa, pero me preguntaba cómo le pasas el resultado al otro programa.

¿O es que desde el otro programa mandas ejecutar el numeros.pl?

Quizás el problema esté en el "\n" que pones al final de la cadena.

Recuerda que, según cómo llames a los programas, los argumentos, o son pasados como argumentos de un programa (separados), o una cadena de texto (todos juntos).

Un ejemplo, tenemos el programa numeros.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. print "1 2 3 4 5 6";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
que lo único que hace es sacar una cadena de caracteres. ¡Ojo!, es una cadena de caracteres, incluyendo los espacios en blanco que separa a los números.

Y luego está el programa graficar.pl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. # ejecutamos el programa números y recibimos sus argumentos
  4. my $x = qx(/usr/bin/perl numeros.pl);
  5.  
  6. print "[$x]\n";
  7.  
  8. # Dividimos por los espacios en blanco
  9. my @x = split " ", $x;
  10.  
  11. print "[" , join(q[|], @x), "]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La ejecución de numeros.pl por parte de graficar.pl es por medio de un system() (escondido dentro de la función qx()), que nos devuelve la salida de numeros.pl (es decir, por la salida estándar). Lo que recibimos es un escalar (una cadena de caracteres), que luego podemos dividir (porque sabemos que el separador es el espacio en blanco.

Ahora... cambiamos graficar.pl por:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. print "[", join("|", @ARGV), "]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
es decir, el programa espera unos argumentos en su línea de comando, y luego los sacamos separados por "|".

Si lo ejecutamos desde la línea de comandos así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@hs-983:~/Desarrollo$ ./graficar.pl $(./numeros.pl)
[1|2|3|4|5|6]
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Ahí estamos usando varias técnicas, pero la principal es la de aprovechar que para el shell del sistema, el espacio en blanco separa argumentos.

Lo que ocurre es lo siguiente: el shell ve que queremos ejecutar esto:

./graficar.pl $(./numeros.pl)

Como hay un '$', intenta expandirlo. Como es un $(...) lo que hace es ejecutar el comando que hay dentro, primero. Sabemos que numeros.pl devuelve una cadena de caracteres. La cadena que nos devuelve es "1 2 3 4 5 6". El shell reconstruye nuestro comando a esto:

./graficar.pl 1 2 3 4 5 6

Y lo vuelve a analizar... y ve que queremos ejecutar graficar.pl con seis argumentos: los espacios en blanco, que antes solo unían a los números, ahora se convierten, para el shell, en separadores.

Y el resultado es que graficar.pl recibe seis argumentos, y no uno (la cadena de texto que devuelve numeros.pl).

Otra forma de verlo, más directa, es esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@hs-983:~/Desarrollo$ /usr/bin/perl -e 'system("./graficar.pl", split " ", qx(./numeros.pl))'
[1|2|3|4|5|6]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aquí, ejecutamos primero numeros.pl. Luego, creamos una lista de argumentos, separando la cadena devuelta de numeros.pl por sus espacios en blanco (con split()), y finalmente y lo más importante: hacemos una llamada al sistema para que ejecute el programa graficar.pl, seguido de esa lista de caracteres. Como se lo estamos dando como lista, el shell del sistema sabe que cada uno es un argumento distinto.

Quizás queda más claro así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@hs-980:~/Desarrollo$ /usr/bin/perl -e '@argumentos = split " ", qx(./numeros.pl);  system("./graficar.pl", @argumentos)'
[1|2|3|4|5|6]
Coloreado en 0.001 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: Mandar argumentos a otro programa

Notapor animal collective » 2010-10-19 09:30 @437

explorer, gracias por la ayuda. El problema fue solucionado.
Mi error fue no enviarle la ruta completa del sqlplus.exe. El programa quedó así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\Perl\bin\perl.exe -w
  2.  
  3. my $var;
  4. $var=`/oraclexe/app/oracle/product/10.2.0/server/BIN/sqlplus.exe -S user/password\@TEST1 \@C:\\TPS_D_TBK.sql`;
  5. my $valor;
  6. my $a;
  7.  
  8. #
  9. # Primer valor
  10. #
  11. $valor=0 + $var;
  12. #
  13. # Segundo valor  
  14. #
  15. my $b = $a;
  16.  
  17. #
  18. # Tercer Valor
  19. #
  20. my $c = $a;
  21.  
  22. #
  23. # Cuarto Valor
  24. #
  25. my $d = $a;
  26.  
  27. #
  28. # Quinto Valor
  29. #
  30. my $e = $a;
  31.  
  32. #
  33. # Sexto Valor
  34. #
  35. my $f = $a;
  36.  
  37. print ("$valor $b $c $d $e $f \n");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Gracias por todo, master.
animal collective
Perlero nuevo
Perlero nuevo
 
Mensajes: 39
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile


Volver a Básico

¿Quién está conectado?

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