r - 从 R 执行 Perl - perlQuote/shQuote?

标签 r perl

我正在尝试使用 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/

相关文章:

R 数据表 fread : specify column data type

r - 增加 ggplot 标题中的下划线大小

regex - 克莱恩之星:为什么$ _ = “a”; s/a */e/g农产品:ee

r - 更有效地覆盖多边形或从空间线中提取()栅格数据

r - 从 RStudio 运行 pdflatex 时出错 - 更新后无法编译 pdf

perl - 推荐一个 WYSIWYG GUI creator for Perl

perl - 我应该使用命令行开关或编译指示打开 Perl 警告吗?

perl - 从重音字符中删除重音

perl - 记录 Perl 代码的最佳方式是什么?

r - 如何在 R 的 networkDynamic 对象中多次有效地激活边缘属性?