【问题标题】:Use variable expansion in heredoc while piping data to gnuplot在将数据传输到 gnuplot 时在 heredoc 中使用变量扩展
【发布时间】: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" 不应被删除。它告诉gnuplotplot 何时停止从- 读取。 (我的版本提示我使用e,但EOF 显然也可以。)
  • Chart::Gnuplot 模块提供了与 gnuplot 程序的(不完整)绑定,这可能比您自己模板化命令更可取。

标签: perl gnuplot piping variable-expansion


【解决方案1】:

我解决了。抱歉问题不完整,我想举一个最小的例子以避免混淆。不幸的是,我的问题错过了重要的部分。就像在 cmets 中所说的那样,我使用几个循环来生成数据并将其通过管道传输到 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 $y\n";
}
print GP "EOF\n";
}

for my $i (1..50){
    # do some other stuff to calculate data points stored in $x and $y
    print GP "$x $y\n";
}
print GP "EOF\n";
}

close(INFILE);
close(GP);

我不知道为什么,但是使用'GNU_EOF'(没有变量扩展)我可以用线刹车命令\定义几个plot

使用"GNU_EOF"我必须在一行中定义它:

plot '-' t "one", '-' t "two"

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

【讨论】:

  • &lt;&lt;"X" 类似于"..."&lt;&lt;'X' 接近'...'。如果要在双引号字符串中包含斜杠,则必须对其进行转义。
猜你喜欢
  • 2017-08-23
  • 2015-03-11
  • 2023-01-13
  • 2014-02-27
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多