2012-06-13 33 views
5

Tôi đang sử dụng chương trình Perl để định dạng đúng cách nhập người dùng vào tệp đầu vào cho chương trình Fortran. Chương trình Fortran tạo ra tệp đầu ra và tệp lỗi. Chương trình Fortran được gọi từ Perl như:Gọi chương trình Fortran từ Perl mà không lưu các tệp đầu vào/đầu ra

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

tôi tự hỏi nếu có một cách để gọi thực thi Fortran mà không thực sự tạo ra các đầu vào/đầu ra/file lỗi và lưu chúng vào đĩa trước/sau Fortran chương trình được gọi là? Tôi hy vọng câu hỏi của tôi là rõ ràng và không phải là một cái gì đó quá rõ ràng. Tôi mới đến Perl và tôi đã cố gắng tìm kiếm ở khắp mọi nơi cho việc này. Cảm ơn vì sự giúp đỡ của bạn trước đó.

+0

Đó hoàn toàn phụ thuộc vào mã Fortran, Perl không tham gia vào nó. [Chỉnh sửa câu hỏi của bạn] (http://stackoverflow.com/posts/11020608/edit) để hiển thị mã Fortran thay thế. – daxim

+0

Tôi không muốn thay đổi thực thi fortran. Tôi tự hỏi nếu có một cách để gọi chương trình fortran mà không lưu các tập tin vào đĩa. – shivsta

+0

Bạn có hỏi liệu bạn có thể truyền một mảng hoặc chuỗi Perl làm dữ liệu '$ inputfile' và sau đó lưu đầu ra' $ outputfile' và '$ errorfile' vào biến Perl sao cho nó có thể được xử lý sau không? – SethMMorton

Trả lời

5

Nếu mã Fortran đọc tuần tự từ và ghi tuần tự đến các tệp hiện có nhưng bạn muốn liên lạc với nó trong "thời gian thực" từ mã Perl, bạn có thể sử dụng named pipes. Chúng vẫn tồn tại như các mục trong hệ thống tập tin và có thể được mở như các tập tin thông thường bởi mã Fortran được đặt tên nhưng đọc/ghi từ/đến chúng hoạt động như đường ống.

Trong Perl bạn sẽ làm một cái gì đó như thế này (ngang nhiên sao chép từ 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. Nếu chương trình Fortran được viết theo cách như vậy, cần có $inputfile làm đối số dòng lệnh, đọc dữ liệu từ đó và xuất kết quả $outputfile$errorfile kết quả là cách duy nhất để làm điều đó là thông qua tệp.

Nếu bạn muốn chuyển dữ liệu đầu vào sang Fortran có thể thực thi thông qua đầu vào tiêu chuẩn, mã nguồn Fortran sẽ phải được sửa đổi để chứa loại đầu vào này.

+0

Ok. Loại đầu vào/đầu ra tiêu chuẩn nào tôi cần phải sử dụng cho perl và fortran? – shivsta

+1

@shivsta Điều đó phụ thuộc vào cách bạn thiết kế đầu vào dữ liệu của mình trong chương trình Fortran. Nếu bạn đang hỏi làm thế nào để sử dụng đọc (*, *), câu hỏi là quá rộng và bạn nên xem xét một số tài liệu tham khảo ngôn ngữ Fortran. Lưu ý rằng cả câu hỏi của bạn lẫn câu trả lời của tôi đều không liên quan gì đến Perl. – milancurcic

+1

Các câu hỏi/câu trả lời không thực sự có nhiều để làm với Fortran hoặc ... Đây thực sự là một câu hỏi về thiết kế chương trình. – mgilson

Các vấn đề liên quan