将数据管道传输到gnuplot时,请在heredoc中使用变量展开



我通常使用以下代码将数据从文件管道传输到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"

很抱歉遇到了麻烦,但也许这对其他人也有帮助(也许你可以向我解释这种行为)。

最新更新