如何在这个Perl代码中进行转义?

时间:2011-08-26 17:47:09

标签: perl escaping

#!/usr/bin/perl
use warnings;
system ("dialog --menu Customize 10 70 50 'Flush rules' 'Clear all the rules' 'Show rules' 'Shows the current rules' 2> /tmp/tmp.txt ")

我想以更易读的形式编写上面的代码,比如

#!/usr/bin/perl
use warnings;
system ("dialog --menu Customize 10 70 50 
'Flush rules' 'Clear all the rules' 
'Show rules' 'Shows the current rules' 
'more options' '........' 2> /tmp/tmp.txt ")

我该怎么做?

3 个答案:

答案 0 :(得分:5)

Perl提供了一个字符串连接运算符,可用于构建大字符串:

system ( "dialog --menu Customize 10 70 50 "
       . "'Flush rules' 'Clear all the rules' "
       . "'Show rules' 'Shows the current rules' "
       . "'more options' '........' 2> /tmp/tmp.txt ");

答案 1 :(得分:2)

system可以采用@args(数组形式):

system ( 'dialog', @args );

答案 2 :(得分:1)

system ( "dialog --menu Customize 10 70 50 "
   . "'Flush rules' 'Clear all the rules' "
   . "'Show rules' 'Shows the current rules' "
   . "'more options' '........' 2> /tmp/tmp.txt ");

Dang,tadmc很快。是的,使用.连接命令。

我建议您在单独的字符串中创建命令,然后执行该命令。我还建议使用qq命令进行引用。这样,您就不必担心单引号和双引号:

my $command = qq(dialog --menu Customize 10 70 50 )
   . qq("Flush rules" 'Clear all the rules' )
   . qq('Show rules' 'Shows the current rules' )
   . qq'more options' '........' 2> /tmp/temp.$$ );

my $error = system $command;

使用qq可以让您不必担心我是否需要使用双引号来允许变量插值或单引号,或者必须转义引号。例如,我能够混合使用双引号和单引号,并且我可以使用Perl变量而不必担心是否必须从单引号更改为双引号。例如,我使用/tmp/temp.$$$$是进程ID,因此如果执行此命令两次,则会使用两个不同的临时文件。

通过为我的命令创建一个单独的变量,我现在可以在以后使用它 - 就像我的系统命令中有错误一样。

顺便说一句,您应该始终检查system命令的返回。如果由于某种原因你不能执行你的系统命令,你很可能想要错误或者至少注意到这个问题。

其中一个问题是系统命令的输出与大多数Perl函数相反。在大多数Perl函数中,返回零表示失败,而返回非零表示成功。但是,system函数恰恰相反。零意味着成功,非零意味着失败。

这可能会导致奇怪的构造:

if (system $command) {
    die qq(Can't execute command "$command"\n);
};

这看起来就像我说如果我的系统命令成功,我应该死,但它的确意味着同样如下:

my $error = system $command;

if ($error) {
   die qq(Can't execute command "$command"\n);
}

语法上更有意义。