我通常使用以下代码将数据从文件管道传输到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 $yn";
}
print GP "EOFn";
}
close(INFILE);
close(GP);
如果我尝试使用"GNU_EOF"
来定义heredoc中的变量,我会收到以下错误:
gnuplot> 187 0.05
^
line 1: invalid command
我不知道
为什么我必须为heredoc使用
""
来获得所需的变量展开和为什么我在第二个例子中出错。
我们非常感谢您的帮助。
我解决了。很抱歉问题不完整,我想举一个最小的例子来避免混淆。不幸的是,我的问题漏掉了重要部分。就像在评论中所说的那样,我使用了几个循环来生成数据并将其传输到gnuplot:
#!/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 '-' t "one",
'-' t "two"
GNU_EOF
open(INFILE,"< stuff.dat") or die "$!n";
while (my $line = <INFILE>) {
for my $i (1..10){
# do some stuff to calculate data points stored in $x and $y
print GP "$x $yn";
}
print GP "EOFn";
}
for my $i (1..50){
# do some other stuff to calculate data points stored in $x and $y
print GP "$x $yn";
}
print GP "EOFn";
}
close(INFILE);
close(GP);
我不知道为什么,但使用'GNU_EOF'
(没有可变展开),我可以用线路制动命令定义几个
plot
。
使用"GNU_EOF"
,我必须在一行中定义它:
plot '-' t "one", '-' t "two"
很抱歉遇到了麻烦,但也许这对其他人也有帮助(也许你可以向我解释这种行为)。