【问题标题】:Single quotes and double quotes in perlperl中的单引号和双引号
【发布时间】:2013-02-16 12:07:50
【问题描述】:

我是 perl 的新手,我正在尝试从 Perl 脚本执行操作系统命令。

操作系统命令用IPC::Open3执行,命令类似

$cmd = "mycommand --add \"condition LIKE '%TEXT%' \"";

这个命令应该把“add”后面的字符串插入到数据库中。

问题是它在数据库中插入的记录没有%TEXT%周围的单引号,像这样:

condition LIKE %TEXT%

如果我在命令提示符下执行命令,它会正确插入字符串。

我应该如何格式化双引号和单引号,以便正确插入数据库?

感谢您的帮助

【问题讨论】:

  • 顺便说一句,如果我在提示符下执行命令,它会正确插入字符串
  • 您可以通过打印$cmd 来判断,$cmd = "mycommand --add \"condition LIKE '%TEXT%' \""; 将字符串mycommand --add "condition LIKE '%TEXT%' " 存储在$cmd 中,这会将参数--addcondition LIKE '%TEXT%' 传递给Unix 上的命令系统。这就是你想通过的吗?
  • 你输入的命令行是什么样子的?
  • 运行正常的命令行是这样的:#mycommand --add "condition LIKE '%TEXT%'"
  • 我猜你的源字符串中的 \\' 将被 perl 视为 \' 并传递给你的 shell,它会将其插入为 ' 作为参数传递给你的程序。

标签: perl postgresql quotes double-quotes


【解决方案1】:

通过将命令放在单个字符串中,您将通过系统的外壳程序对其进行传递。 (你没有提到它是 cmd.exe 还是 bash 或其他有趣的东西。)

建议:

  1. 将系统命令创建为字符串数组将避免 shell 重新插入命令行。 @cmd = ('mycommand', '--add', q(condition LIKE '%TEXT%'));

  2. 添加额外的反斜杠以保护 shell 中的单引号。在您的命令前添加echo 有助于调试......

  3. (我个人最喜欢的)不要为您的数据库访问付出代价。 use DBI

【讨论】:

  • IPC::Open3不像system()qx(),没有shell解析。不过,1 和 3 是非常好的答案。
  • @jordanm:查看IPC::Open3 (v1.12) 的第 273 行。 exec() 在第 4 个及以后的参数上调用。 (1..3 在第 201 行移出。) exec() 的文档确实表明带有 shell 字符的单个字符串会产生穿过 shell 的行程。
【解决方案2】:
$cmd = q{mycommand --add "condition LIKE '%TEXT%'"};

qq 用于双引号,q 用于单引号。

这样它就可以按原样接收整个命令。

【讨论】:

  • 我喜欢这样思考:"..."qq"..." 的缩写,'...'q'...' 的缩写。
猜你喜欢
  • 2010-10-30
  • 2011-05-08
  • 1970-01-01
  • 2013-12-14
  • 2013-02-16
  • 2013-08-25
相关资源
最近更新 更多