私は Perl を使用して、入力を Gnuplot にパイプする CGI プログラムを次のように記述しています。
まず、.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 が有効な端末であることが示されます。