• ベストアンサー

置換処理で500エラー

掲示板のCGIを作成し、運営してましたが最近 業者からの書込が増えてきたため「特定の文字を消去」するようにしました。 $com : 掲示板の書込内容 @word : 消去するための特定文字 変数 foreach (@word) {  if ($_) {   $com =~ s/$_/---/ig;  } } 取りあえず「特定文字」を変数扱いにし、「---」に置き換えるようにしたのですが、「特定文字」によっては『500 Internal Server Error』が出てしまいます。(例)オープン など どのように記述したら宜しいのでしょうか? ご教授下さいm(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

それは文字コードがシフトJISであるために起こる問題です。 シフトJISの全角文字は2バイトで構成されていますが、いくつかの文字はその2バイト目にアスキー文字が割り当てられているのです。 例えば「オープン」の場合、ー が 0x81 0x5B というコードであり、2バイト目の 0x5B が [ (開き大括弧)のコードであるため、これが正規表現のメタ文字として扱われ、対応する括弧がないためにエラーとなるのです。 幸い正規表現には「特定区間のメタ文字を無効化するメタ文字」が用意されているので、これを利用して   $com =~ s/\Q$_\E/---/ig; とするとよいでしょう。 ※メタ文字が含まれる可能性のある箇所を、\Q~\E で囲みます。 その他にも回避方法はあるのですが、他の問題を引き起こしやすいので、この方法がお勧めです。

kazon_ume
質問者

お礼

ご回答ありがとうございます。 文字コードが関係しているのですね。 早速、利用させて頂きますm(__)m ありがとうございました。

その他の回答 (1)

回答No.1

質問にあるソースをコピペでプログラムを作ってみましたが問題ないようです。 パーミッション等は大丈夫でしょうか。 一つ気になった点ですが、インデントは半角スペースまたはタブで設定されてますでしょうか? 説明が下手ですいません。 少しでも参考になれば幸いです。 私が書いたソースは下記になります。 ----------------------------------------- #! /usr/bin/perl $com = qq[ テストようの文字列です。 aaa,bbb,ccc,ddd,EFG,AAA ]; @word = ( "aaa", "テスト", ); foreach (@word) { if ($_) { $com =~ s/$_/置換後/ig; } } print "content-type:text/html\n\n"; print "$com";

kazon_ume
質問者

お礼

ご回答ありがとうごさいます。 インデントはタブで設定してます。 @word = ("aaa","テスト"); は私もOKでしたが、 @word = ("aaa","テスト","オープン"); にすると500エラーが表示されてました。

関連するQ&A