我正在尝试使用 system
从 R 运行一些 Perl : 简单地将一个字符串(在 R 中提供)分配给一个变量并回显它。 ( system
调用在 /bin/sh
中执行)
echo <- function (string) {
cmd <- paste(shQuote(Sys.which('perl')),
'-e',
shQuote(sprintf("$str=%s; print $str", shQuote(string))))
message(cmd)
system(cmd)
}
# all fine:
# echo('hello world!')
# echo("'")
# echo('"')
# echo('foo\nbar')
但是,如果我尝试
echo
一个反斜杠(或任何以反斜杠结尾的字符串),我收到一个错误:> echo('\\')
'/usr/bin/perl' -e "\$str='\\'; print \$str"
Can't find string terminator "'" anywhere before EOF at -e line 1.
(注意:
$
前面的反斜杠很好,因为这可以防止 /bin/sh
认为 $str
是一个 shell 变量)。错误是因为 Perl 正在解释最后一个
\'
作为 $str
中的嵌入式引号与转义的反斜杠相反。事实上,要让 perl 回显我需要做的反斜杠> echo('\\\\')
'/usr/bin/perl' -e "\$str='\\\\'; print \$str"
\ # <-- prints this
也就是说,我需要为 Perl 转义我的反斜杠(除了我在 R/bash 中转义它们)。
我如何确保
echo
用户输入的字符串是打印的字符串?即唯一需要的转义级别是在 R 级别? 即是否有某种
perlQuote
功能类似于 shQuote
?我应该手动转义 echo
中的所有反斜杠吗?功能?还有其他我需要转义的字符吗?
最佳答案
不要生成代码。那很难。相反,将参数作为参数传递:
echo <- function (string) {
cmd <- paste(shQuote(Sys.which('perl')),
'-e', shQuote('my ($str) = @ARGV; print $str;'),
shQuote(string))
message(cmd)
system(cmd)
}
(您也可以使用环境变量。)
(我以前从未使用过甚至见过 R 代码,所以请原谅任何语法错误。)
关于r - 从 R 执行 Perl - perlQuote/shQuote?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16632223/