Используйте расширение переменной в heredoc при передаче данных в gnuplot

Обычно я использую код, подобный следующему, для передачи данных из файла в 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, чтобы получить желаемое расширение переменной и

  • почему я получаю ошибки для второго примера.

Помощь высоко ценится.

1 ответ

Решение

Я решил это. Извините за неполный вопрос, я хотел привести минимальный пример, чтобы избежать путаницы. К сожалению, мой вопрос пропустил важную часть. Как сказано в комментариях, я использую несколько циклов для генерации данных и передачи их в 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"

Извините за борьбу, но, возможно, это также полезно для кого-то еще (и, может быть, вы можете объяснить мне это поведение).

Другие вопросы по тегам