2016-05-27 9 views
2

私はPerlの初心者です。私は以下のPerlコマンドを使って自分のtclスクリプトの "/ $"シーケンスを検索して置き換えています。これはうまくいきます。linuxコマンドラインで直接使用するとうまくいきます。Perl検索と置換コマンドが別のPerlスクリプトの中から呼び出されたときに動作しない

perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl 

私は唯一の「`」バックティックとし、システムコマンドを使用して別のPerlスクリプトでPerlの上記ワンライナーを呼び出すために呼び出しています。

system(`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl`); 
`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl`; 

私は下のエラーが発生しています。この問題でお手伝いください。

Bareword found where operator expected at -e line 1, near "$/g" 
(Missing operator before g?) 
Final $ should be \$ or $name at -e line 1, within string 
syntax error at -e line 1, near "s//$/" 
Execution of -e aborted due to compilation errors. 

私は分離のために「%」演算子を使用すると、私はエラーが、ジョブが実行されていない表示されませんでした、私はちょうどSEDのコマンドのように%や#などの他の分離演算子を使用することができるかどうか知らないけど。

`perl -p -i -e 's%\/\$%\/\\\$%g' sed_list.tcl`; 

ウェブ上のこの特定の問題については、十分な結果が得られませんでした。どんな助けもありがとうございます。

+0

http://stackoverflow.com/questions/619926/should-i-escape-shell-arguments-in-perl – xxfelixxx

+3

なぜシステムコマンドでバックティックを使用していますか? '' system( "") 'のように' '' 'を使うべきです。 – serenesat

+0

ご返信ありがとうございます。 システム( "perl -p -i -e '/ \/\ $/\/\\\ $/g' sed_list.tcl"); これは私がすでに試したものですが、使用していません。私はまだ同じエラーが発生します。修正を提案してください。私はあなたに試してみよう – Sridhar

答えて

0

システムコマンドにコマンドを渡すか、バックティック( ``)オペレータを使用して外部コマンドを実行できます。

system(q{perl -p -i -e 's/\/\$/\/\\\$/g' sed_list.tcl})

かのようにバッククォートを使用します:コメントでポールによって示唆されるように :

`perl -p -i -e 's/\/\$/\/\\\$/g' sed_list_gen.tcl` 

編集文字列としてシステム()機能にコマンドを渡してください。

+0

あなたの返事をありがとう。 指定したようにシステム機能を使用しているときに、flat_rtl_genで構文エラー " "というエラーが表示されます。plの175行目、 "system"の近く flat_rtl_gen.plの実行がコンパイルエラーにより中断されました。 " Back Ticksを使用したとき、私は以下のエラーが発生しました "オペレータがflat_rtl_gen.pl行177 "前の行にセミコロンがありませんか? flat_rtl_gen.pl行で構文エラーが発生しました。 177、perl -p -i -e 's/\/\ $/\ sed_list_gen.tcl "' " の近くにお勧めします。 。 – Sridhar

+0

私は試してみましたが、間違いを発見していません。あなたはflat_rtl_gen.plを投稿できますか?また、 "perl -c flat_rtl_gen.pl"を実行し、結果を投稿してください。これらの詳細を追加するには、質問を編集してください。 – SilentMonk

+0

こんにちは静かなモンク、以下のコードは 'perl -p -i -e 's/\\\/\\\ $/\\\/\\\\\\\ $ \ g'ファイル';私は本当にありがとうございます。私はあなたのコードを試してみて、あなたを更新します。 – Sridhar

0

ここでは、システムコマンドを使用している間にすべてのバックスラッシュをエスケープするか、またはPerlスクリプト内のBackTicksを使用して別のコマンドを呼び出すことを提案します。しかし、後で彼らは答えを消してしまった。それは私のために働いた。私は努力して私の質問を解決するのに私を助けてくれたすべての人に感謝したいと思います。

ここに正しい動作コードがあります。再び私を助けるためのコミュニティのための

system("perl -p -i -e 's/\\\/\\\$/\\\/\\\\\\\$/g' sed_list_gen.tcl"); 

おかげで、以下に示すよう

`perl -p -i -e 's/\\\/\\\$/\\\/\\\\\\\$/g' sed_list_gen.tcl`; 

または使用するシステム機能。 。 。

+0

私の良さは悲惨に乱雑です。あなたはそれを掃除するために2つのステップを取ることができます。 1)あなたの 'system()'コマンドに、補間しない引用符を使用します。 2)検索と置換に '/'以外の区切り文字を使用してください: 'system(q {perl -p -i -e's!/ \ $!/ \\ $! '});' –

関連する問題