perl中的单引号和双引号

Posted

技术标签:

【中文标题】perl中的单引号和双引号【英文标题】:Single quotes and double quotes in perl 【发布时间】: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,它会将其插入为 ' 作为参数传递给你的程序。 【参考方案1】:

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

建议:

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

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

    (我个人最喜欢的)不要为您的数据库访问付出代价。 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 = qmycommand --add "condition LIKE '%TEXT%'";

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

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

【讨论】:

我喜欢这样思考:"..."qq"..." 的缩写,'...'q'...' 的缩写。

以上是关于perl中的单引号和双引号的主要内容,如果未能解决你的问题,请参考以下文章

JS中的单引号和双引号

SQL语言中的单引号与双引号区别

JSON中的单引号和双引号

SQL Server 中的单引号和双引号

shell中的单引号和双引号的区别

r Markdown的Yaml标头中的单引号和双引号有啥区别?