- ベストアンサー
perlで置換をするプログラムを作成したい
- ウエブの更新プログラムをperlで作成しています。以下の条件式でうまく置換できないときがあります。通常の文字は置換できたのですが、以下のようなリンクを変えようとすると結果が変わりませんでした。
- プログラムを確認してみたところif($get_csv =~ /$oldcont/i)で条件式にうまくヒット出来ていない感じです。タグ禁止処理が悪さしているのがわかり、タグ禁止処理は解除いたしました。それでもなお動作しませんでした。
- 何か不足しているものがありましたらご指摘ください。お手数かけます。ご指導をよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
$oldcont に ? などの正規表現で使う文字が入っている場合は、 \Q と \E で挟んで正規表現と解釈されないようにするとよいです。 if($get_csv =~ /\Q$oldcont\E/i) { $get_csv =~ s/\Q$oldcont\E/$newcont/g; ... のような感じですね。
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
>if($get_csv =~ /$oldcont/i) { >$get_csv =~ s/$oldcont/$newcont/g; これ、$oldcontを正規表現として評価しますから /?が 「/ が0または1個」と解釈されてます。 他のが動作したのはたまたまです。 任意の一文字を表す正規表現 . が、文字.と一致しただけです。 ためしに $oldcont = <a href="....://hoge..../enta.html"> としても置き換わるはずです。
お礼
kmeeさん 回答ありがとうございます。 >>if($get_csv =~ /$oldcont/i) { >>$get_csv =~ s/$oldcont/$newcont/g; >これ、$oldcontを正規表現として評価しますから >/?が 「/ が0または1個」と解釈されてます。 そうなんですね。勉強になります。 私は、perlを使用してまもないのでこのような情報は本当にありがたいです。 いろいろと壁にぶち当たったときにここで助けていただいてます。 ありがとうございます。
- t-okura
- ベストアンサー率75% (253/335)
条件式にうまくヒットしないときの、$get_csv の中身はわかりますか。 前後の不要な部分をカットして提示できないでしょうか。 if($get_csv =~ /$oldcont/i) { で大文字小文字を区別しないで比較していますが、 置き換えるところでは $get_csv =~ s/$oldcont/$newcont/g; のように大文字小文字を区別しています。 それが置き換わらない原因ということはないですよね。
補足
t-okuraさん 回答ありがとうございます。 >条件式にうまくヒットしないときの、$get_csv の中身はわかりますか。 はい。以下のものになります。 (ここから) <a href="http://hoge.com/entb.html">テストbooksb</a> <a href="http://hoge.com/entc.html">テストbooksc</a> <a href="http:/seibyou.sub.jp/au/?mov=3">テストbooks</a> <a href="http://hoge.com/enta.html">テストbooksa</a> <br> (ここまで) <a href="http:/seibyou.sub.jp/au/?mov=3">を置換出来ないです。 <a href="http://hoge.com/enta.html">は置換出来ました。 perlで使用する引数が悪さしているのでしょうか? すみません。お手数かけます。 よろしくお願いいたします。
お礼
回答ありがとうございます。 早速やってみました。 >if($get_csv =~ /\Q$oldcont\E/i) { >$get_csv =~ s/\Q$oldcont\E/$newcont/g; バッチリ動作しました!! ありがとうございます!! とっても助かりました。これで作業が進められます。