我想要一个 Perl 脚本来显示一个简单的 gnuplot 图表。我不想在文件中存储任何数据,我想使用 gnuplot 单行代码,例如:
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。
最佳答案
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);
关于bash - 如何使用 system() 从 Perl 调用 gnuplot one-liner?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47465627/