open - perl read file
Llamando al programa Fortran desde Perl sin guardar los archivos de entrada/salida (2)
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 Fortran se llama desde Perl como:
system "/mydirectories/fortranexecutable $inputfile $outputfile $errorfile";
Me pregunto si hay una forma de llamar al ejecutable Fortran sin crear realmente los archivos de entrada / salida / error y guardarlos en el disco antes / después de que se llame al programa Fortran. 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.
No. Si el programa Fortran está escrito de tal manera que toma $inputfile
como un argumento de línea de comando, lee datos de él y genera $outputfile
y $errorfile
como resultado, la única forma 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 tendría que ser modificado para acomodar este tipo de entrada.
Si el código de Fortran lee de forma secuencial 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 moverse usando pipes con nombre . 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 harías algo como esto (descaradamente copiado de esta respuesta ):
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 ...