2016-11-02 295 views
-2

我想把下面的系统命令放到perl脚本中,但是 sed表达式同时包含引号和反引号,我不知道如何将它们全部转义,所以它会执行我的系统命令完全按照我的需要。在Perl脚本中的sed系统命令

下面是命令的例子:

mysql -u root -D porta-billing -e "..." | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" 
+4

不要这样做!使用[DBI](https://metacpan.org/pod/DBI)。 – ThisSuitIsBlackNot

+0

我想把一个shell命令放到脚本中。不多。我不想学习一个新的处理程序 – Vadym

+1

通过'system'调用MySQL客户端和sed比使用DBI和本机Perl命令更容易出错,而且DBI并不是很难学。文档的[“大纲用法”](https://metacpan.org/pod/DBI#Outline-Usage)部分是一个很好的起点。 – ThisSuitIsBlackNot

回答

3

这个问题的答案你问的问题是使用qx(...)操作。 qx(...)是反引号的“选择你自己的分隔符”版本。

my $output = qx[ ... ]; 

或者

my $output = qx(...); 

或者

my $output = qx! ... !; 

很容易发现,也不会在你的命令字符串中的字符发生冲突的分隔符。

但这个问题的答案,你应该问的问题有两个部分:

  • 不要从你的Perl程序中调用mysql - 使用DBI代替。
  • 请勿从Perl程序中调用sed - 使用Perl代码来操纵文本。

我对我的答案的第一部分感到有些紧张,因为我担心你只会采取我的哈克解决方法,并最终导致无法维护的混乱。请注意下半年的建议 - 即使您在这种情况下忽略它。