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
中,这会将参数--add
和condition 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中的单引号和双引号的主要内容,如果未能解决你的问题,请参考以下文章