2011-08-26 34 views
3
#!/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 ") 

我想寫上面的代碼更可讀的形式這樣如何在此Perl代碼中轉義?

#!/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 ") 

我怎樣才能做到這一點?

+1

您是否試過「。」? (即句點爲字符串連接)? – transistor1

+0

糟糕!我忘了那個。謝謝:) –

+0

總是樂於提供幫助,如果我可以! – transistor1

回答

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 "); 
2

system可以採取@args(數組形式):

system ('dialog', @args); 
+1

這是行不通的,因爲OP使用的是shell元字符,所以他不需要繞過shell ...所以他需要對system()的1-arg調用。 – tadmc

+0

@tadmc:對 - 除非他努力在Perl本身中實現I/O重定向。 –

+0

'join「」,@ args'而不是'@ args'應該可以工作 – Itamar

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 "); 

蕩,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); 
} 

從語法上講,這更有意義。