• ベストアンサー

Perlでのマッチング処理について

検索CGIを作成しているのですが、検索文字に「ー」(-ハイフンではありません。日本語入力の言葉を伸ばすやつです。”サーバ”とか。)が入った文字を指定し、POSTするとServerErrorになってしまいます。サーバはレンタルものなので原因が分からず途方にくれています。どなたかPerlに詳しい方、ぜひよいアドバイスを下さい。ちなみに処理は下記のように行っています。 (1)検索する元のデータはsjisである。  ↓ (2)ブラウザのフォームから、検索したいデータがsjisでPOSTされる。  ↓ (3)ReadParseにてデータを変数へ取り込む。(cgi-lib.pl使用)  ↓ (4)CGIにて、POSTされたデータをeucへ変換。(jcode.pl使用)  ↓ (5)検索する元のデータが入ったファイルをオープン。  ↓ (6)ファイルから1行づつ読み込み変数へ格納。  ↓ (7)変数へ格納したデータをeucへ変換。  ↓ (8)if (${POSTされたデータ} =~ /${ファイルから読み込んだデータ}/)といった形でマッチング処理  ↓ (9)ファイルをクローズし、マッチングしたデータをsjisで結果表示。 ※まだデバッグ途中なのですが、とりあえず今判明しているのは 『インターネット』などというふうに、『ー』がキーに入るとエラーになります。 どなたかよろしくお願いします。

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

  • ベストアンサー
  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.2

2バイトの文字を1バイトずつ処理する時にエラーが出るのですね。 方法としては#1の方のおっしゃる通り、EUCで扱うのが一番良いのではないでしょうか。 日本語ってやっかいです(^^; 文字コードについて詳しく載っているサイトを2つほどご紹介しておきますね。

参考URL:
http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/faq/faq2.html#c4,http://www.din.or.jp/~ohzaki/perl.htm
yaya999
質問者

お礼

参考URLで、私にとってBlackBoxであった文字コードについての理解が深まりました。ありがとうございます。確かにEUCで全て記述することによって、一発解決致しました。

その他の回答 (3)

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

EUCへ変換、と書かれていますが、きちんと変換されていないのではないでしょうか。 シフトJISの「ー」の文字コードは「0x815B」となっていますが、この2バイト目のコード「0x5B」は「 [ 」の文字コードであり、これは正規表現のメタ文字です。 このためマッチングを行うと、正規表現が正しく書かれていないというエラーになります。 これを回避するためには、quotemeta関数を使います。 この関数を使用することで、メタ文字などは全てエスケープされます。 使い方は、次のような感じです。   $word = quotemeta($word); 普通、マッチングに使うデータは、この関数を通します。 ちなみに(8)の部分は、POSTデータと読込データが逆ではないですか? 通常は、   if (被検索文 =~ /検索語/) { となると思うのですが。

yaya999
質問者

お礼

なるほど、quotemetaなんて関数があったのですね。素人ですみません。 皆様からのいろいろなアドバイスを受け、試行錯誤した結果、全ソース、 及びデータもEUCにすることで解決致しました。でもまだ試してはいないの ですが、quotemetaを使用したロジックでもうまくいきそうな気がします。 ご助言誠にありがとうございました。

  • tfp
  • ベストアンサー率37% (3/8)
回答No.3

大文字小文字の判別や正規表現である必要がなければ、(4)と(7)の処理をなくして、(8)をindex関数を使ったサーチにしてみてください。ほとんどの場合うまくいきますし、高速です。 以下、簡単なサンプルです。 ------------------------------------------------ $data = 'インターネットサービスプロバイダ'; $words = 'ー'; if (index($data, $words) > -1) { print '検索文字列「', $words, '」が見つかった'; } else { print '検索文字列「', $words, '」は見つからない'; }

yaya999
質問者

お礼

う~ん、index関数も試してみました。ですが、なんだかうまくいかないんですよ~。レンタルサーバなので、なかなかデバッグ情報が得られなくって・・・。 結果、全てをEUCにすることで対処致しました。 貴重なご助言、本当にありがとうございました。

  • Spur
  • ベストアンサー率25% (453/1783)
回答No.1

EUCにしてください。

yaya999
質問者

お礼

おっしゃる通りです。

関連するQ&A