2016-11-02 292 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代碼來操縱文本。

我對我的答案的第一部分感到有些緊張,因爲我擔心你只會採取我的哈克解決方法,並最終導致無法維護的混亂。請注意下半年的建議 - 即使您在這種情況下忽略它。