プロが教えるわが家の防犯対策術!

Perlで特殊文字の入った文字列置換を行いたいです。
例えば

HTMLファイルの中の
<a href = “http://abc.jp>
<a href = “http://def.jp>に変えるとき


$old = ‘abc’;
$new = ‘def’;

open(INFILE,”test.html”)
while(<INFILE>){
print "infile\n";
if($_=~m|$old|){
$_=~s|$old|$new|g;
}
}
close INFILE;


で動きますが、URLに'?'が入ると検索が動作しません。
?の他にも<,&,%,なども特殊文字があります。
これらの文字が入った置換を行うにはどのようにしたら良いでしょうか?

質問者からの補足コメント

  • ?に\をつけて

    <a href = “http://old.jp?aaa&gt;
    <a href = “http://new.jp.bbb&gt;に変えたいとき

    とりあえず
    $old = "old.jp\?"
    $new="new.jp."

    とすると、置換らしきものはしてくれるのですが
    <a href = “http://new.jp?aaa&gt;
    と、?が残ってしまいます。

    さらに、
    $old = "old.jp\?aaa"
    $new="new.jp.bbb"
    とすると、検索にひっかからないです。

      補足日時:2019/11/15 17:26

A 回答 (4件)

ダブルクォートでくくった文字列のなかではエスケープシーケンスを評価するので


$old = "old.jp\?";

$old = "old.jp?";
は同じ挙動になるはず. ということで #3 の通り \Q~\E (あるいは quotemeta) を推奨.

ちなみに
if ($_ =~ m/$old/) {
$_ =~ s/$old/$new/g;
}

$_ =~ s/$old/$new/g;
で十分だし, さらにいえば対象が $_ なので
s/$old/$new/g;
だけでもいいね.
    • good
    • 0
この回答へのお礼

ありがとうごいました。勉強になりました。

お礼日時:2019/11/17 00:09

https://perldoc.jp/docs/perl/5.14.1/perlre.pod
> \Q \E までパターンメタ文字の無効化(Quote)
    • good
    • 0
この回答へのお礼

ありがとうごいました。勉強になりました。

お礼日時:2019/11/17 00:10

<a href = “

http://old.jp?aaa&gt;
<a href = “http://new.jp.bbb&gt;に変えたいとき
の例です。
indexとsubstrを使います。正規表現用の特殊文字も普通の文字と同じように扱えます。

$old = 'old.jp?aaa';
$new = 'new.jp.bbb';

open(INFILE,"test.html");
while(<INFILE>){
$pos = index($_,$old);
if ($pos >= 0){
substr($_,$pos,length($old),$new);
}
print $_;
}
close INFILE;
    • good
    • 0
この回答へのお礼

ありがとうごいました。勉強になりました。

お礼日時:2019/11/17 00:10

Perlの正規表現をマスターしよう


https://tutorial.perlzemi.com/blog/2010082712785 …

正規表現文字のエスケープ
が参考になると思います。
つまり、検索対象として特殊文字自体を指定するためには直前に\を付ければよいので
\?
とすればいいのではないでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。
直前に\をつけたら検索はうまく行きましたが、まだ問題があります。

参考URLはしっかり読んでみますが、補足しますので、もしすぐに解決できるならば、ご教示願いたいです。

お礼日時:2019/11/15 17:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!