Используйте расширение переменной в 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"
Извините за борьбу, но, возможно, это также полезно для кого-то еще (и, может быть, вы можете объяснить мне это поведение).