Página 1 de 4

Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-17 10:41 @487
por Alfumao
Hola a todos,

Necesito usar Perl o CGI para enviarle instrucciones a un programa externo que se ejecuta desde la línea de comandos. No tengo ni idea de cómo enfocar el tema, por eso no puedo poner ningún script de ejemplo. La idea es recoger de una página web varios parámetros (bien desde formularios, bien desde una línea de input de texto) y con esto componer la instrucción para enviar al otro programa y que éste la ejecute.

¿Me podríais dar ideas para ir enfocando el asunto?

¿Cómo se mandarían, desde Perl, los parámetros que generan una instrucción a la que dicho programa pueda responder?


Un saludo y perdonad la ambigüedad.

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-17 11:22 @515
por explorer
Pero, ¿cómo son los argumentos que quieres enviar?

Si son solo cadenas de caracteres, las puedes enviar en la misma línea de comando que ejecuta el programa...

> Necesito usar Perl o CGI

Aclaración. Perl es un lenguaje de programación. CGI es un protocolo de comunicación y ejecución de procesos. Los CGI se pueden escribir en cualquier lenguaje, solo que en este foro nos gusta hacerlo en Perl :)

Yo, supongo, que lo que has querido decir es que no sabes si crear un programa que se ejecute desde el sistema o un programa cgi que se ejecute desde el servidor web.

Para ejecutar un programa externo, mírate estos hilos:

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-17 12:40 @569
por Alfumao
Hola explorer,

Concreto más: sí, quiero mandar esta instrucción a un programa llamado Blast.exe. ¿Cómo lo hago?
Según lo expuesto en los posts que me comentaste (uno lo inicié yo mismo por otro tema y ni me acordaba...) debería escoger la opción qx() porque espero una resultado de vuelta. Una vez elegida opción, ¿cuál es la sintaxis correcta para esta instrucción?

¿Sería así?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. qx(Blast.exe);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Y para incluir la orden, ¿así?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. qx(tblastn -query RR.fasta -db Sp23G -out RR.out);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Siento ser tan torpe con estos temas.

Un saludo

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-17 13:17 @595
por explorer
De esa manera estás ejecutando los programas, pero no estás recogiendo los resultados.

Debería ser así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $resultado = qx(tblastn -query RR.fasta -db Sp23G -out RR.out);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora bien... esto solo funcionará si tblastn es un comando reconocido por el sistema. Si el sistema donde estás no sabe dónde está el comando tblastn, debes indicar la ruta completa. Por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $resultado = qx(C:/Blast/tools/tblastn -query RR.fasta -db Sp23G -out RR.out);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y pasa lo mismo con los argumentos RR.fasta y RR.out. tblastn debe saber dónde están esos ficheros. Por defecto, deberían estar en el mismo directorio en donde estás ejecutando el programa. Pero si no es así, deberás colocar la ruta completa a esos archivos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $resultado = qx(tblastn -query C:/Practica/pruebas/RR.fasta -db Sp23G -out C:/Practica/pruebas/RR.out);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El directorio de trabajo lo puedes cambiar desde dentro de Perl, con el comando chdir(), si necesitas moverte por el árbol de directorios.

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-17 14:12 @633
por Alfumao
¡¡¡Muchísimas gracias, explorer!!!

Lo probaré en cuanto pueda y comentaré cómo me ha ido.

:D

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-17 18:50 @826
por pvaldes
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $argumento_pasado_como_variable = "-f";
  2.  
  3. my $fo = system("programa $argumento_pasado_como_variable");
  4.  
  5. my $fo = `programa $argumento_pasado_como_variable`;
  6.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


depende mucho de cómo funcione el ejecutable y qué argumentos se puedan pasar, algunos fallan, hay cosas que no pueden hacerse tan fácilmente con system().

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-17 19:17 @845
por explorer
Pero, pvaldes... no nos dejes así...

¿Qué cosas no se pueden hacer con system()?

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-20 05:21 @264
por Alfumao
Tengo un problema a la hora de utilizar las soluciones que me disteis.

Estoy intentando cargar los archivos para utilizar el programa (he empezado con HMMer que es más sencillo de usar que BLAST) desde una página HTML, a través de un formulario de subida de archivos (el que muestra el botón "Examinar"). El resultado se consigue sin problemas cuando el archivo está en la misma carpeta que el CGI desde el que llamo a la ejecución del HMMer, pero si está en cualquier otra ubicación, el procedimiento no funciona...

Os paso el script del CGI para que lo veáis:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin/perl.exe
  2. use warnings;
  3. use strict;
  4. use CGI ':standard';
  5.  
  6. # HTTP HEADER
  7. print "content-type: text/html\n\n";
  8.  
  9. my $file= param('file');
  10. my $profile= param('profile');
  11.  
  12. my $resultado = `hmmsearch "$profile" "$file" > C:/xampp/htdocs/WEB/$file.out`;
  13. #funciona tambien usando "qx();"
  14.  
  15. my $report= "$file.out";
  16.  
  17. print qq(<A HREF='$report' TARGET='_blank'>-Open in browser or Right click to download file-</A><br><br><br><br><br>\n);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


A ver si no he metido la pata en algo muy tonto...

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-20 13:29 @604
por explorer
Prueba a poner la ruta completa, al ejecutable.

Re: Cómo enviar instrucciones a un programa desde Perl

NotaPublicado: 2011-08-20 14:05 @628
por Alfumao
Hola, explorer,

El problema no es el ejecutable (que estará residente en la carpeta del mismo cgi), el problema me lo dan los archivos que deben ser recibidos del HTML mediante:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $file= param('file');
  2. my $profile= param('profile');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No entiendo por qué, pero si los archivos no están en la carpeta del cgi, es como si no los recibiera, y esa ruta de enlace ha de venir dada por el ordenador del usuario, yo no la puedo poner...