Geo*_*org 2 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')
Run Code Online (Sandbox Code Playgroud)
这显示了点(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);
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
-e plot "-"
^
"<(echo -e 'plot "-"\n1 1\n2 3\n3 1.7\n4.5 5\ne')", line 1: invalid command
Run Code Online (Sandbox Code Playgroud)
这个错误让我感到惊讶,因为传递给的字符串system(),如错误消息中引用的那样,显然是正确的.
不知道如何修改$plotString,以便system()将正确地解释gnuplot的命令?
次要问题:如何绘制图表with lines?(即使在Perl之外,我也无法使用gnuplot单行程来完成它.)
编辑:我的操作系统是Ubuntu 16.04.
system($shell_cmd)
Run Code Online (Sandbox Code Playgroud)
是的缩写
system('/bin/sh', '-c', $shell_cmd)
Run Code Online (Sandbox Code Playgroud)
但是你所拥有的不是一个有效的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)
Run Code Online (Sandbox Code Playgroud)
您似乎也可以使用以下内容来避免创建两个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);
Run Code Online (Sandbox Code Playgroud)