アプリ版:「スタンプのみでお礼する」機能のリリースについて

掲示板のCGIを作成し、運営してましたが最近 業者からの書込が増えてきたため「特定の文字を消去」するようにしました。

$com : 掲示板の書込内容
@word : 消去するための特定文字 変数

foreach (@word) {
 if ($_) {
  $com =~ s/$_/---/ig;
 }
}

取りあえず「特定文字」を変数扱いにし、「---」に置き換えるようにしたのですが、「特定文字」によっては『500 Internal Server Error』が出てしまいます。(例)オープン など

どのように記述したら宜しいのでしょうか?
ご教授下さいm(__)m

A 回答 (2件)

質問にあるソースをコピペでプログラムを作ってみましたが問題ないようです。


パーミッション等は大丈夫でしょうか。

一つ気になった点ですが、インデントは半角スペースまたはタブで設定されてますでしょうか?

説明が下手ですいません。
少しでも参考になれば幸いです。

私が書いたソースは下記になります。
-----------------------------------------
#! /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";
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/10/18 18:49

それは文字コードがシフトJISであるために起こる問題です。


シフトJISの全角文字は2バイトで構成されていますが、いくつかの文字はその2バイト目にアスキー文字が割り当てられているのです。

例えば「オープン」の場合、ー が 0x81 0x5B というコードであり、2バイト目の 0x5B が [ (開き大括弧)のコードであるため、これが正規表現のメタ文字として扱われ、対応する括弧がないためにエラーとなるのです。

幸い正規表現には「特定区間のメタ文字を無効化するメタ文字」が用意されているので、これを利用して
  $com =~ s/\Q$_\E/---/ig;
とするとよいでしょう。

※メタ文字が含まれる可能性のある箇所を、\Q~\E で囲みます。

その他にも回避方法はあるのですが、他の問題を引き起こしやすいので、この方法がお勧めです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/10/18 18:53

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