将heredoc从Perl管道传输到Gnuplot



很快,我就遇到了从Perl脚本中获取Gnuplot命令墙的问题,这些命令通过管道传输到Gnuplot本身。我最初的主要参考资料是关于佩尔蒙克斯的。子功能看起来像:

sub binPics {
my $inFileName = shift;
my $outFileName = shift;
my $outputFormatPics = shift;
open(GP, "| gnuplot") or die "Error while piping to Gnuplot: $! n";
    print GP << "   GNU_EOF"
    plot "$inFileName" u 2 lw 2.5 lc 1 , "" u 3 lw 2.5 lc 2
    set terminal $outputFormatPics
    set output '$outFileName.$outputFormatPics'
    replot
    GNU_EOF
}

在此之后,用类似的语法但不同的Gnuplot命令定义第二个子函数。我按照我定义的顺序来调用这些子函数。在脚本的后面,将进一步使用生成的图片。这会产生错误。

那么,这里的问题是什么?一个可能的运行脚本会是什么样子?

我将给出这个问题的固定脚本,但无法完整解释heredoc语法。请随意这样做或提出其他建议。

/编辑

缩进不再以SO样式显示。heredoc中的行有选项卡作为第一个命令(用于构建代码)。

主要问题是缺少文件句柄GP的关闭。在没有关闭的情况下,第一个子函数没有引起任何问题(或者更具体地说:应该在脚本稍后使用的一般图片在这里不会产生错误),因为第二个子函数由于第二个open(GP, "| gnuplot")-语句而关闭了调用。但在第二个子功能中,管道没有关闭,因此可能会导致错误。

关闭管道时,还需要在print-语句中添加分号。我不知道为什么没有close(GP)的脚本没有缺少分号的问题,也不知道制表符缩进是否是个问题。

尽管如此,这对我来说是有效的,也许有人也感兴趣:

sub binPics {
my $inFileName = shift;
my $outFileName = shift;
my $outputFormatPics = shift;
open(GP, "| gnuplot") or die "Error while piping to Gnuplot: $! n";
print GP << "GNU_EOF";
plot "$inFileName" u 2 lw 2.5 lc 1 , "" u 3 lw 2.5 lc 2
set terminal $outputFormatPics
set output '$outFileName.$outputFormatPics'
replot
GNU_EOF
close(GP);
}

最新更新