2016-11-02 11 views
-2

以下のようなシステムコマンドをperlスクリプトに入れようとしていますが、 sed式には引用符とバッククォートの両方が含まれています。これらのすべてをエスケープする方法がわからないので、システムコマンドを必要なだけ正確に実行します。ここでsedシステムコマンドperlスクリプト

は、コマンドの例を示します。

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

私はスクリプトにシェルコマンドを入れたいと思っています。それ以上ではない。 – Vadym

+1

'システム 'を介してMySQLクライアントとsedを呼び出すことは、DBIとネイティブのPerlコマンドを使用するよりはるかにエラーが発生しやすく、DBIはそれほど学習が難しくありません。ドキュメントの[outline usage](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コードを使用してください。

私の答えの最初の部分については、ちょっと心配しています。私はあなたのハックの回避策を取って、維持できない混乱で終わることを心配しています。この場合は無視しても、後半のアドバイスに注意してください。