我想通过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级别进行转义?
也就是说,是否有类似于shQuote
的perlQuote
函数?我应该在echo
函数中手动转义所有反斜杠吗?还有其他需要进行转义的字符吗?