1

不久,我遇到了从 Perl 脚本通过管道传输到 Gnuplot 本身的 Gnuplot 命令墙的问题。我的主要参考资料是perlmonks。子函数看起来像:

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-syntax。随意这样做或提供其他建议。

/编辑

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

4

1 回答 1

2

主要问题是缺少关闭文件句柄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);
}
于 2013-08-07T15:06:50.420 回答