【发布时间】:2013-12-06 14:31:03
【问题描述】:
我通常使用如下代码将数据从文件传输到 gnuplot 并在 Perl 脚本期间创建图片:
#!/usr/bin/perl
use warnings;
use strict;
my $in="file.dat";
open(GP, "| gnuplot") or die "$!\n";
print GP << "GNU_EOF";
set terminal png size 1920,1080 font 'Verdana,15' dashed
set output 'out.png'
plot "$in"
GNU_EOF
close(GP);
我必须定义"GNU_EOF" 而不是'GNU_EOF',这样我才能使用像$in 这样的变量。
现在我想使用不是直接从文件中读取的数据。我的代码如下:
#!/usr/bin/perl
use warnings;
use strict;
open(GP, "| gnuplot") or die "$!\n";
print GP << 'GNU_EOF';
set terminal png size 1920,1080 font 'Verdana,15' dashed
set output 'out.png'
plot '-'
GNU_EOF
open(INFILE,"< stuff.dat") or die "$!\n";
while (my $line = <INFILE>) {
for my $i (1..10){
# do some stuff to calculate my data points stored in $x and $y
print GP "$x $y\n";
}
print GP "EOF\n";
}
close(INFILE);
close(GP);
如果我尝试使用 "GNU_EOF" 来在 heredoc 中定义变量,则会收到如下错误:
gnuplot> 187 0.05
^
line 1: invalid command
我不知道
为什么我必须为 heredoc 使用
""以获得所需的变量扩展和为什么我在第二个示例中出现错误。
非常感谢您的帮助。
【问题讨论】:
-
我的猜测是,您需要传递的不仅仅是两个坐标给 gnuplot。第一个示例中的 file.dat 是什么样的?
-
对我来说,您的示例在没有
print GP "EOF\n";和pngcairo的情况下工作正常(而不是png,因为dashed终端选项)。 -
@Christoph,您误读了我写的内容,因为我完全知道错误来自
gnuplot。无论如何,由于其他原因,我已经删除了我的评论。 -
@Christoph,
print GP "EOF\n"不应被删除。它告诉gnuplot的plot何时停止从-读取。 (我的版本提示我使用e,但EOF显然也可以。) -
Chart::Gnuplot 模块提供了与 gnuplot 程序的(不完整)绑定,这可能比您自己模板化命令更可取。
标签: perl gnuplot piping variable-expansion