2012-06-13 8 views
5

Ich verwende ein Perl-Programm, um Benutzereingaben richtig in eine Eingabedatei für ein Fortran-Programm zu formatieren. Das Fortran-Programm erstellt eine Ausgabedatei und eine Fehlerdatei. Das Fortran-Programm wird von Perl genannt wie:Fortran-Programm von Perl aufrufen, ohne Eingabe-/Ausgabedateien zu speichern

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

Ich frage mich, ob es einen Weg gibt, ohne die Fortran ausführbare rufen tatsächlich die Eingabe/Ausgabe/Fehler-Dateien zu erstellen und sie auf die Festplatte gespeichert werden vor/nach der Fortran Programm heißt? Ich hoffe meine Frage ist klar und nicht zu offensichtlich. Ich bin neu in Perl und habe versucht, überall danach zu suchen. Danke im Vorraus für deine Hilfe.

+0

, die vollständig auf dem Fortran-Code abhängt, ist Perl nicht in sie ein. [Bearbeiten Sie Ihre Frage] (http://stackoverflow.com/posts/11020608/edit), um stattdessen den Fortran-Code anzuzeigen. – daxim

+0

Ich möchte die Fortran-Programmdatei nicht ändern. Ich frage mich, ob es eine Möglichkeit gibt, das Fortran-Programm aufzurufen, ohne Dateien auf der Festplatte zu speichern. – shivsta

+0

Fragen Sie, ob Sie ein Perl-Array oder eine Zeichenkette als $ Inputfile-Daten übergeben können und speichern Sie dann die Ausgaben $ OutputFile und $ errorfile in eine Perl-Variable, damit sie nachbearbeitet werden kann? – SethMMorton

Antwort

5

Wenn der Fortran-Code sequenziell aus bereits vorhandenen Dateien liest und sequenziell in bereits vorhandene Dateien schreibt, Sie aber in "Echtzeit" mit dem Perl-Code kommunizieren möchten, können Sie sich mit named pipes umgehen. Sie existieren immer noch als Einträge im Dateisystem und können wie gewöhnliche Dateien durch den Fortran-Code geöffnet werden, der ihren Namen angibt, aber das Lesen/Schreiben von/zu ihnen funktioniert wie ein Piping.

In Perl würden Sie so etwas tun (eklatant von this answer kopiert):

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. Wenn Fortran-Programm in einer solchen Art und Weise geschrieben, dass es $inputfile als Befehlszeilenargument nimmt, liest Daten aus und gibt $outputfile und $errorfile als Ergebnis der einzige Weg, dies zu tun, ist durch eine Datei.

Wenn Sie es vorziehen würden, Eingabedaten über Standardeingabe an Fortran ausführbar zu übergeben, müsste der Fortran-Quellcode geändert werden, um diese Art von Eingabe zu ermöglichen.

+0

Ok. Welche Art von Standard-Input/Output müsste ich für Perl und Fortran verwenden? – shivsta

+1

@shivsta Das hängt davon ab, wie Sie Ihre Dateneingabe im Fortran-Programm gestalten. Wenn Sie fragen, wie man read (*, *) benutzt, ist die Frage zu weit gefasst und Sie sollten sich einige Fortran-Sprachreferenz ansehen. Beachte, dass weder deine Frage noch meine Antwort etwas mit Perl zu tun haben. – milancurcic

+1

Die Frage/Antwort hat auch nicht wirklich viel mit Fortran zu tun ... Das ist wirklich eine Frage des Programmdesigns. – mgilson

Verwandte Themen