如何使用system()从Perl调用gnuplot单行程?

时间:2017-11-24 02:39:21

标签: bash perl gnuplot sh

我想要一个Perl脚本来显示一个简单的gnuplot图。我不想在文件中存储任何数据,我想使用gnuplot one-liner,例如:

gnuplot -p <(echo -e 'plot "-"\n1 1\n2 3\n3 1.7\n4.5 5\ne')

显示点(1,1),(2,3),(3,1.7)和(4.5,5)。

在Perl脚本中,我尝试了类似

的内容
$plotString  = "\"<(echo -e 'plot \\\"-\\\"\\n";
$plotString .= "1 1\\n2 3\\n3 1.7\\n4.5 5\\ne')\"";
system('gnuplot -p ' . $plotString);

但是我收到以下错误:

-e plot "-"
^
"<(echo -e 'plot "-"\n1 1\n2 3\n3 1.7\n4.5 5\ne')", line 1: invalid command

此错误令我感到惊讶,因为传递给system()的字符串(如错误消息中所引用的)显然是正确的。

知道如何修改$plotString所以system()会正确解释gnuplot命令吗?

次要问题:如何绘制图表with lines? (即使在Perl之外,我也无法使用gnuplot单行程来完成它。)

编辑:我的操作系统是Ubuntu 16.04。

1 个答案:

答案 0 :(得分:5)

system($shell_cmd)

的缩写
system('/bin/sh', '-c', $shell_cmd)

但是你所拥有的不是有效的sh命令,而是bash命令。这意味着您需要调用bash

my $cmd = q{gnuplot -p <(echo -e 'plot "-"\\n1 1\\n2 3\\n3 1.7\\n4.5 5\\ne')};
system('bash', '-c', $cmd)

看来你也可以使用以下内容来避免创建两个shell:

my $program = <<'__EOS__';
plot "-"
1 1
2 3
3 1.7
4.5 5
e
__EOS__

open(my $pipe, '|-', "gnuplot", "-p")
print($pipe $program);
close($pipe);