【问题标题】:How to call a gnuplot one-liner from Perl using system()?如何使用 system() 从 Perl 调用 gnuplot one-liner?
【发布时间】:2018-05-08 00:25:06
【问题描述】:

我想要一个 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 one-liner 做到这一点。)

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

【问题讨论】:

  • 欢迎来到quoting hell。乍一看,在我看来,您在变量周围有一组额外的引号。但是您已经将事情包裹在如此多的引用中,以至于很难说清楚。我建议尝试一个更简单的字符串,然后慢慢地建立起来。这很可能是一个简单的转义错字。

标签: bash perl gnuplot sh


【解决方案1】:
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);

【讨论】:

  • 知道为什么system('bash', '-c', $cmd) 有效而system('/bin/sh', '-c', $cmd) 无效吗?我的意思是,bash -csh -c 都从以下命令字符串操作数中读取命令。
  • 正如我已经解释过的,这是因为$cmd 不包含有效的sh 命令。 &lt;( ... )bash 功能。
  • 似乎也可以使用单反斜杠:my $cmd = q{gnuplot -p &lt;(echo -e 'plot "-"\n1 1\n2 3\n3 1.7\n4.5 5\ne')};
  • 您可以在明确的情况下放弃在单引号中转义反斜杠。我没有。
猜你喜欢
  • 2013-09-02
  • 2016-11-22
  • 2014-03-19
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
相关资源
最近更新 更多