• ベストアンサー

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で結果表示。 ※まだデバッグ途中なのですが、とりあえず今判明しているのは 『インターネット』などというふうに、『ー』がキーに入るとエラーになります。 どなたかよろしくお願いします。

  • Perl
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • マッチング処理

    はじめまして、今、javaでマッチング処理を実装しているのですが、どうしても上手くいきません、どのようにすれば良いでしょうか? 以下は、要件です。御覧下さい。 「fileAとfileBがあり、それをソートした状態でマッチングを行う。 尚、fileAは、8桁の数字がランダムに格納されており、数は約20000件程度(重複した数字あり)である。また、fileBも同じような形で格納されており、数は30件程度(重複なし)である。これら2つのファイルをマッチングして、新しいファイルに書き出す」 今のところ、fileAとBをtreeSetでソートしたものの、上手くマッチング処理が働かず、出来たファイルは空か、全くマッチングされない状態のファイルが吐き出されるばかりです。正直、ハマりの状態で、googleで調べても、中々当たりのページがありません。どのようにすれば、よいでしょうか?御手数ですが、ご教授下さい。

  • RootFTPでサーバからダウンロードする際、EUCかSJISに変換するか聞かれる

    こんにちは。 RootFTPを使用し始めたのですが、サーバからダウンロードする際、EUCかSJISに変換するか聞かれます。 ホームページ作成時,htmlはSJISだと思うのですが、EUCかSJISか聞かれてしまいます。 ほかに、CGIファイルなども聞かれます。 すべてSJISに変換してダウンロードするのでしょうか?それとも、EUCでダウンロードするのでしょうか? よろしくお願いします

  • Perlでuse strictと %inの共存

    use strictを使うと、変数の使用に厳密にチェックしてくれるので、便利だと思い使いましたが、ReadParse後の%inを利用する場合に宣言されていないエラーが表示されます。意味的には正しいですが、$in{'test'}など CGIで受け取った内容が扱えなくなるので、困っております。何か解決方法は有るのでしょうか? use strict; require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; my $x = $in{'md'};

    • ベストアンサー
    • Perl
  • cgi.pmとcgi-lib.pl

    こんばんは。 cgi-lib.plを引用したCGIが動かないので、cgi.pmでためしにやろうと思っています。 そこでひとつ調べてもわからないのですが、cgi-lib.plのReadParseでは%inにフォームで送信したデータが全て入るのに対し、cgi.pmではいったいどこに全てのデータが格納されているのでしょうか?要素ごとに取り出す方法は調べることができましたが、配列ごとまとまって入っているところがわかりません。 ご存知のかた教えてください。よろしくお願いします。

  • eucデータをsjisに変換できない。

    require './jcode.pl'; &jcode::convert(*name,'euc'); レンタルサーバーのMySQLがeucでしかデータを受け取らない ので以上のような形にしてSQL文を投げました。 結果、htmlでsjisにして吐き出す際に取り出すデータもeucで表示されるため変換できないかと悩んでいます。 while( @row = $sth->fetchrow_array() ) { 1jcode::convert(\$row,'sjis'.'euc'); 2jcode::convert(\$row,'sjis'); 3jcode::convert($row,'sjis'.'euc'); と複数試しましたがダメでした。 Perlのバージョンにより違いがあるので、 全ての先頭に&付けて再度試しましたがうまくエンコードできません。 どなたか解決方法をご存知の方、ご教授ください。

  • perl これは前文検索システムの処理に近いでしょうか?

    先日、カレンダー日記のperlによるスクリプト構造について質問させていただいたのですが、 今回の質問は、その処理をする上で知っておくべき処理は何なのかを教えていただきたく、質問させて頂きました。 perlの参考書は多いですが、以下の処理をズバリ書いてくれている書籍はないので、以下の処理を実現するなら、このような処理を書いている本を買えばいいというような助言をお願いします。書籍名でも助かります。 以下、処理の内容 カレンダー日記の構造は、 日付けをクリックすると、例えば本日なら、20030427という値を変数に格納して、 nikki.cgiファイルに飛ばすようにしようと思っています。 nikki.cgiファイルは、受け取った変数を記憶して、 nikki.datファイルからその、20030427で始まる一行を探すようにします。 nikki.datファイルの中身は、一つの改行コードが出てくるまでを一日分とします。 たとえば、 20030427,4月27日(土),22:14,今日も快晴だった というような一行が、一日分です。 こうした一行が何行も書かれているnikki.datファイルの中からクリックされた日付けを見つけ出して、返すという仕組みです。 データベース的な処理?のようなので、どういった知識をつければ、より今後の勉強に役に立つか、そういったことを知りたくなったので、アドバイスを頂きたいと思います。 書店で見たperlの本のサンプルは、たいてい、 掲示板、チャット、アクセスカウンタ、全文検索、などばかりで、 カレンダー日記というのはなかったもので、果たしてどういう処理の勉強から取り組めばいいのか、そこに立ち返ろうと思っています。 全文検索あたりがnikki.datファイルの中から一行を選び出すという意味で、 似ているかなと思ったのでタイトルにしてみましたが、実際のところ、どうでしょうか。 宜しくお願いします。

    • ベストアンサー
    • CGI
  • EUCコードのページからの送信での文字化け対策法

    EUCのhtmlページからフォーム内容をPOSTで送っているのですが、 そのデータファイルをhtmlに出力するほうのcgiはs-jisで作っています。 この場合、データ送信時にEUCをs-jisに変換して送信することって出来ますか? 出来ない場合はやっぱりcgiのほうでデータを s-jisに変換するしかありませんか?

    • ベストアンサー
    • CGI
  • 別サーバーで画像を処理する

    formで送信されたデータをデータベースと画像を別サーバーにして 処理したいのですがいい方法はないでしょうか? form文でpost送信された値をデータベースに格納し、 input type=fileで指定された画像データのみを別サーバーに送信して格納 したいのですがうまくいきません、方法があればアドバイス願えませんでしょうか。

    • 締切済み
    • PHP
  • EUCとSJISの変換文字列のレコードへの書込みについて

    WindowsのサーバーでデータベースはMySQLです。今回、Linuxのサーバーからもダイレクトにデータを取得(SQLのselect文)しWindowsのサーバーへデータの書込みを行ったりLinux側へデータ書込みを行うことになりました。 そこでEUC,SJISの文字列変換なのですが、レコードセットなどSelect文でEUCのデータを取得するとSQLでエラーになったり正常に値が取得できません。NKF32でテキストファイル間では変換できるのですが、直接テーブルからデータを取得しEUCまたはSJIS変換をおこないSQLで書込みを行うことはやはりVBでは無理なのでしょうか。ご経験又は知識 をお持ちの方ご教示板だければ幸いです。

  • ファイル間の変数引き継ぎ方法を教えてください。

    初心者です。初歩的な内容ですみません。 cgiのファイル間で変数を引き継ぎたいです。 入力.html  (postで変数を引継ぎ)  ↓ 処理1.cgi (html吐き出しなし)(変数追加・改めてpostのような形で引継ぎ)  ↓ 処理2.cgi (変数利用) cookieや ファイル名.cgi?key=変数 と言う形ではなく htmlのpostのようなことをcgiでもやりたいです。 よろしくご指導お願いいたします。

    • ベストアンサー
    • CGI

専門家に質問してみよう