1

我正在使用 Perl 编写一个 CGI 程序,将输入通过管道传输到 Gnuplot,如下所示:

如何从 perl 调用 gnuplot 脚本

首先,我通过编写一个 .gnu 文件并在 bash 终端中使用 gnuplot 执行它来测试我所有的 gnuplot 绘图例程。我已经尝试了许多具有相应输出格式的不同 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 上运行“设置终端”表明 cairolatex 是一个有效的终端。

4

1 回答 1

0

您可能想为此尝试一个CPAN 模块,我碰巧知道它比您想象的要难。

我熟悉的是PDL(Perl 数据语言)的扩展,称为PDL::Graphics::Gnuplot

于 2013-02-06T01:23:00.770 回答