2012-06-13 4 views
5

Estoy usando un programa Perl para formatear adecuadamente la entrada del usuario en un archivo de entrada para un programa Fortran. El programa Fortran crea un archivo de salida y un archivo de error. El programa de Fortran se llama desde Perl como:Llamando al programa Fortran desde Perl sin guardar los archivos de entrada/salida

system "/mydirectories/fortranexecutable $inputfile $outputfile $errorfile"; 

Me pregunto si hay una forma de llamar al ejecutable Fortran sin llegar a la creación de los archivos de entrada/salida/error y guardarlos en el disco antes/después de la Fortran programa se llama? Espero que mi pregunta sea clara y no algo demasiado obvio. Soy nuevo en Perl y he intentado buscar esto en todas partes. Gracias por su ayuda con anticipación.

+0

Eso depende completamente de código Fortran, Perl no entra en ella. [Edite su pregunta] (http://stackoverflow.com/posts/11020608/edit) para mostrar el código Fortran en su lugar. – daxim

+0

No quiero alterar el ejecutable fortran. Me pregunto si hay una manera de llamar al programa Fortran sin guardar archivos en el disco. – shivsta

+0

¿Está preguntando si puede pasar una matriz Perl o un string como el dato '$ inputfile' y luego guardar el resultado' $ outputfile' y '$ errorfile' en una variable Perl para que pueda ser procesada posteriormente? – SethMMorton

Respuesta

5

Si el código de Fortran lee secuencialmente y escribe de forma secuencial en archivos ya existentes, pero le gustaría comunicarse con él en "tiempo real" desde el código de Perl, entonces puede usar named pipes. Todavía existen como entradas en el sistema de archivos y se pueden abrir como archivos normales con el código Fortran dado su nombre, pero leer/escribir desde/hacia ellos funciona como tuberías.

En Perl que haría algo como esto (descaradamente copiado de this answer):

use File::Temp qw(tempdir); 
use File::Spec::Functions qw(catfile); 
use POSIX qw(mkfifo); 

my $dir = tempdir(CLEANUP=>1); 
my $inputfifo = catfile($dir, "input"); 
mkfifo($inputfifo, 0700) or die "mkfifo($inputfifo) failed: $!"; 
my $outputfifo = catfile($dir, "output"); 
mkfifo($outputfifo, 0700) or die "mkfifo(output$fifo) failed: $!"; 
my $errorfifo = catfile($dir, "error"); 
mkfifo($errorfifo, 0700) or die "mkfifo($errorfifo) failed: $!"; 

... open the FIFOs ... 

system "/mydirectories/fortranexecutable $inputfifo $outputfifo $errorfifo"; 

... operate with the FIFOs to communicate with the Fortran code ... 

... close FIFOs and remove $dir when finished ... 
3

No. Si el programa está escrito en Fortran de tal manera que se necesita $inputfile como un argumento de línea de comandos, lee los datos de ella, y las salidas $outputfile y $errorfile como resultado, la única manera de hacerlo es a través de un archivo.

Si prefiere pasar datos de entrada al ejecutable de Fortran a través de la entrada estándar, el código fuente de Fortran debería modificarse para acomodar este tipo de entrada.

+0

Ok. ¿Qué tipo de entrada/salida estándar necesitaría usar para Perl y Fortran? – shivsta

+1

@shivsta Eso depende de cómo diseñe su entrada de datos en el programa Fortran. Si está preguntando cómo usar read (*, *), la pregunta es demasiado amplia y debería consultar alguna referencia en el lenguaje de Fortran. Tenga en cuenta que ni su pregunta ni mi respuesta tienen nada que ver con Perl. – milancurcic

+1

La pregunta/respuesta en realidad tampoco tiene mucho que ver con Fortran ... Esto es realmente una cuestión de diseño del programa. – mgilson

Cuestiones relacionadas