1

私は Perl を使用して、入力を Gnuplot にパイプする CGI プログラムを次のように記述しています。

perl から gnuplot スクリプトを呼び出す方法

まず、.gnu ファイルを作成し、それを bash ターミナルで gnuplot を使用して実行することにより、すべての gnuplot プロット ルーチンをテストします。対応する出力形式 (「set terminal ...、set output ...」) でさまざまな gnuplot 端末を試しましたが、これは常に機能します。

次に、この最初のテストを実行した後、同じ「文字列」(大まかに言えば) を .gnu ファイルから perl スクリプトの gnuplot にパイプしようとします。文字列に適切にエスケープ文字が含まれていることを確認するために、何度もチェックしました。これは epslatex 端末では機能しますが、png、gif、pdf、jpeg、cairolatex、または pdfcairo 端末では機能しませんが、これらすべての端末タイプは最初のテスト ケースで機能しました。「動作しない」とは、Perl CGI でこれらの端末を使用すると、出力名のファイルが生成されるが、サイズが 0kB になるということです。

次のように、パイプのフラッシュに何か問題があるのではないかと思いました。

親プロセスが終了するまで、子の出力が表示されないのはなぜですか?

しかし、gnuplot にパイプで渡された文字列の末尾に改行文字を追加し、autoflush ($|=1) をオンにしても問題は解決しませんでした。

私はかなり困惑しています。何が起こっているのでしょうか?

編集:コード例は次のとおりです。

動作します:

open my $GP, '|-', 'gnuplot';  
my $GPoutput = "set xrange [-5:5]  
set terminal epslatex  
set output \"graph1.tex\  
plot sin(x)";  
$|=1;  
print $GP "$GPoutput";

動作しません:

open my $GP, '|-', 'gnuplot';  
my $GPoutput = "set xrange [-5:5]  
set terminal cairolatex  
set output \"graph1.tex\  
plot sin(x)";  
$|=1;  
print $GP "$GPoutput";

$GPoutput の文字列を .gnu ファイルに入れ、コマンド ラインから gnuplot を実行すると機能しますが、gnuplot で "set terminal" を実行すると、cairolatex が有効な端末であることが示されます。

4

1 に答える 1

0

これにはCPAN モジュールを試してみるのもいいかもしれませんが、あなたが思っているよりも難しいことを私は知っています。

私がよく知っているのは、PDL::Graphics::Gnuplotと呼ばれるPDL (The Perl Data Language) の拡張機能です。

于 2013-02-06T01:23:00.770 に答える