Perlの&検索についての質問

このQ&Aのポイント
  • Perlで&検索を実行する方法についての質問です。
  • 質問者は指定したファイルから受け取った単語をスペースで分割し、それぞれをマッチさせて検索したいとしています。
  • しかし、現在の実装ではうまく動作していないようです。どのように修正すれば良いでしょうか。
回答を見る
  • ベストアンサー

Perl アンド検索

恐れ入ります。 perlにて、&検索を実行する為に、以下のようにしています。 しかしうまく動作しません。 use CGI $word = $form->param('word'); open (IN<, "xxx.txt"); $rec=<IN>; $where="$rec ne '' "; if($word ne ''){ $word =~ s/ / /g; @word_array = split(/ / , $word); foreach (@word_array){ $where .= "and $rec=~/$_/ "; } } if($where){ @rec=split(/,/, $rec); //省略 xxx.txtを$recに格納して、フォームより送信されてきたスペース区切りの語句を、分割し、各々をマッチさせて検索したいのですが、 どのようにしたらよいでしょうか。よろしくお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> if($where){ これは、$whereという変数が示す値が真か偽か、で判定されます。 このプログラムで$whereに代入されるのは「ただの文字列」です。 if( $where ) が if ($rec ne '' and (略) )になって、neによる比較やandに論理計算がされるわけではありません。 eval関数を使うと、文字列をPerlのプログラムとして解釈して eval($where) が $rec ne '' and (略) になって、neによる比較やandに論理計算がされます。 ただ、現状は $where="$rec ne '' ";の時点で$recが展開されます $rec='a b c d' だと eval($where) は a b c d ne '' となり、期待通りの動作をしないでしょう。 一つは、エスケープを使うなどして、 $whereを期待通りの式にするものです。 $where="\$rec ne '' "; にすれば、$recという文字列がそのまま残るので eval($where) → $rec ne '' となります。 ただ $where .= "and $rec=~/$_/ "; を $where .= "and \$rec=~/\$_/ "; としてしまうと、$_は既に変化しているので期待通りにはならないし、 $where .= "and \$rec=~/$_/ "; だと、 xxx.txt内の単語が「X/Y」だったりすると $rec=~/X/Y/ となり文法違反です もう一つは(こちらを勧めます) 「判定式の文字列」を作るのではなく、判定結果そのものを求めるものです。 ne , andなどは真か偽の値を返します。その値を変数に入れることができます。 $where = ($rec ne '') ; だと、$recが''なら偽、 $recが''でないなら真が$whereに代入されます。 $where .= "and $rec=~/$_/ "; を $where = $where and ($rec=~/$_/ ); にすれば、それまでの$whereと、 ($rec=~/$_/ ) とのandとなります。 if($where)とすれば、$whereの真偽によって分岐します。 あとは open (IN<, "xxx.txt"); は open (IN, "<xxx.txt"); か open (IN,'<', "xxx.txt"); の間違いだとして。 $rec=<IN>; これは xxx.txt の「最初の1行」を「改行付きで」読みこむことになります。 @rec=split(/,/, $rec); で、最後の要素には改行文字が付いたままです。 それでよろしいですか? xxx.txtに日本語等の多バイト文字を使用していませんか? 文字コードによっては、期待通りに動作しないかもしれません。

spider32
質問者

お礼

ありがとうございます。無事に検索が可能になりました。 ご丁寧なご返答ありがとうございました。

関連するQ&A

  • AND検索がうまくできない

    登録したデータを検索するPerlを制作しています。 #$in{word}は入力されたキーワードで、半角スペースまたは全角スペースでキーワードを分割 @word = split(/\s| /,$in{word}); $count = @word; #@dataは検索対象となるデータ foreach $data (@data){  $a = 0;  while ($a < $count){   if($data =~ /$word[$a]/){    push(@query, $data);    last;   }   $a++;  } } こんな感じでAND検索できるようにしてみたのですが、エラーになります。 Perlチェックをかけてみると構文はOKと出ます 複数語、つまりAND検索でなく1つの言葉(@wordが1つだけ)の場合はうまくいきます また、逆にif($data =~ /$word[$a]/){をなしにしてやれば(これをはずすと検索にならず全ヒットになりますが)複数ワードでも正しく表示されます $aや$count、@word、$word[$a]などが正しくできていないのかと思い、それを表示させて確認してみましたが、きちんと代入され、やりとりできているようなのですが、どこに問題があるのでしょうか。 数日間ネットで調べ、色々試し、本も開いて色々検証しましたがどうしてもわかりません。 間違いをご指摘ください PS プログラム部分の右へインデントしているところは半角スペースやタブだとこのページでは無視されるようなので、見やすくするため全角スペースでずらしていますが、実際のプログラム中ではここに全角スペースなんぞ使っておりません

    • ベストアンサー
    • Perl
  • phpを使いファイル内を検索

    phpでファイル内を検索したいです。 以下のようにphpを書きましたが、やりたいことは1行目から5行目までの中でphpという言葉を検索し6行目から10行目までの中でsnsという文字を検索といったように、行数で分けて検索する言葉も分けたいです。 どのように書いて良いかなどのヒントなどいただけないでしょうか。 $file = dirname(__FILE__) . '/list.txt'; $word = 'php'; if(is_file($file)){ $array = @file( $file, FILE_IGNORE_NEW_LINES); if(in_array($word,$array)){ print_r($word); } } ?>

    • 締切済み
    • PHP
  • php+mysqlでand検索

    ソースコード抜粋 下記のコードを見つけたのですがNotice: Undefined variable: where・・・。 と表示されて実行できません。 なにぶんPHP初心者なのでわかり易く教えてください。 $search = str_replace(" ", " ", $text); $keywords = preg_split("/[  ]+/",$text); $where = " where 1"; foreach( $keywords as $word ){ $where .= " and $key2 like '%$word%'"; } //SQL文 $result = mysql_query("select * from song $where ORDER BY number ASC LIMIT $start,$end");

    • ベストアンサー
    • PHP
  • 複数ワード検索(PHP)の区切り文字について

    PHP初心者です。 データベースの検索処理を実装しようとしています。 一般の検索エンジンのように、半角スペース、全角スペース、どちらも区切り文字として認識させて、スペースで区切った複数ワードによる検索抽出ができるようにしたいのです。 データベース例) 青山病院 伊藤病院 井上病院 青山歯科 鈴木歯科 「青山 井上」(全角スペース)と検索しても、「青山 井上」(半角スペース)と検索しても、 青山病院 井上病院 青山歯科 という検索結果にしたい。 実際にコードをかいてみたのが以下です。 $searchwords = "青山 井上"; //全角スペース $array_searchwords = mb_split("[  ]", $searchwords); ////[  ]には全角スペース $sql = "SELECT hospitalname FROM hospital"; foreach( $es_array_searchword as $k => $v ) { # 1ワード毎のカッコ区切り(開始)  if( $k == 0 ) {   $sql .= " WHERE (";  } else {   $sql .= " OR (";  }  $sql .= " hospitalname LIKE '%${v}%'";  $sql .= " ) ";  echo $sql; } このようにかくと、$sqlは、 「SELECT hospitalname FROM hospital WHERE ( hospitalname LIKE '%青山%' ) OR ( hospitalname LIKE '%%' ) OR ( hospitalname LIKE '%井上%' )」 と出力されます。 要するに、$searchwords = "青山 井上";、の「全角スペース」が文字として認識されてしまいます。 これを、 「SELECT hospitalname FROM hospital WHERE ( hospitalname LIKE '%青山%' ) OR ( hospitalname LIKE '%井上%' )」 というsql文で実行できるようにしたいのです。 $array_searchwords = mb_split("[  ]", $searchwords); の[  ]の書き方が問題になるのかなと思いますが、全角スペース区切りを生かすには、どうかけばよろしいでしょうか?

    • ベストアンサー
    • PHP
  • AND検索がきちんとできません

    PHP、MYSQLの勉強を始めたばかりの者です。 AND検索をしたいのですが…… きちんと検索できません。 データの中身 データタイトル|キーワード A|テスト B|サンプル 以下のようにすると、「テ」「ス」でAのデータは出てくるのですが、 「テ」「サ」で検索すると、 一つもでてこないはずなのに、Bのデータが出てきます。 「サ」「テ」ですとAのデータがでてきてしまいます。 何故でしょうか。 自分なりに考えてはみたのですが、お手上げ状態です。 何卒、宜しくお願いします。 <form method="GET" action="sample.php"> <input type="text" name="q" size="20"> <input type="submit" value="search"> </form> <?php require_once 'dbmanager.php'; $pdo = getDb(); // クエリ設定 if (isset($_GET['q'])) { $q = htmlspecialchars($_GET['q']); //クエリを入力 $q = str_replace(" ", " ", trim($q)); $words = explode(" ",$q); } // 解析 $tmp = []; $wd = []; $i = 0; foreach($words as $word) { if(!empty($word)) { $tmp[] = " keyword LIKE :word".$i." "; $wd[] = '%'.$word.'%'; $i++; } } // SQL if(count($tmp) > 0){ $sql = "SELECT * FROM ttables WHERE (".implode("AND",$tmp).") ORDER BY id DESC"; $search_sql = $pdo->prepare($sql); foreach($wd as $key => $word){ $search_sql->bindParam(':word'.$key, $word); } $search_sql->execute(); // while while($row = $search_sql->fetch(PDO::FETCH_ASSOC)) { print"<li>{$row['keyword']}{$row['title']}</li>"; } }

    • ベストアンサー
    • PHP
  • Perlのエラー(絞込検索時にファイルロックが。。。

    こんにちは。よろしくお願いします。 Perlの担当者が休まれているため、急遽システムの修正~を行うことになったPerl初心者です。 Perlで作成されているシステム内の、「検索機能」の部分でエラーが出て困っています。 テキストボックスがあり、その中に文字をいれ、検索ボタンを押すと、あらかじめ登録を行っておいたデータのタイトル~にあたる部分との照らし合わせを行い、絞り込んで表示していく~ような検索機能です。 そのテキストボックスに「[」や「+」、「(」、「)」、「*」などを入力して実行させてしまうと、システムが動かなくなります。(エラー表示は無く、画面が真っ白に。 その後、そのシステムの設置フォルダと同じフォルダ内に「システムで設定した名前.txt.lock」というフォルダが作成されていて、それを削除しない限りはシステムが動きません。 原因としては、ファイルロックを行って、ファイルの中身を読み込んで、その最中に上記の検索~のための比較を行い、表示するものを格納して、ファイルロックを解除~。。。 の、比較~の部分かと思っています。 if($file[3]){ $file[3] =~ s/\ /KUGIRI_SPACE/g; $file[3] =~ s/\ /KUGIRI_SPACE/g; local @keyword = split(/KUGIRI_SPACE/, $file[3]); foreach $keyword (@keyword){ @word = split(//, $keyword); $search_keyword = shift @word; foreach $word (@word){ if($word =~ /[^a-zA-Z0-9]/){ $search_keyword .= "\\$word"; }else{ $search_keyword .= "$word"; } } if($one_log[2] !~ /$search_keyword/i){ $Agreement = "NO"; } } } if($Agreement eq "NO"){ undef $Agreement; next; } こんな感じのソースなのですが、 「if($one_log[2] !~ /$search_keyword/i)」の部分で、比較を行っているのだと思いますが。。。 この先の原因究明~が分かりません。 ファイルのロックについてや上記ソースで気になる点など、何でもかまいませんので知恵をお貸し願えませんでしょうか??

    • ベストアンサー
    • Perl
  • 大文字と小文字を区別しない検索にする方法

    勉強する間もなく手探りでフリーCGIの改造をさせて頂いています。 if ゃ foreach などは分かりやすいですが、変数の意味が良く理解できていません。 どうぞお力添えをお願い致します。 現在、フリーのCGIでデータ登録と検索をしていますが、大文字と小文字の 区別を無くしたものにするにはどうすればよいでしょうか? 1) AbcDe も abcde も同じにしたい。 2) 可能なら全角と半角も区別無しにしたい。   ただ、2の方は漢字も使うので難しいでしようか? iオプションを使えとの記述を見ましたが、どこを変えるのか解りません。 ソースを載せますので、ご指導宜しくお願い致します。 # 入力内容を整理 $in{'word'} =~ s/\x81\x40/ /g; @wd = split(/\s+/, $in{'word'}); @find=(); $i=0; # 検索処理 foreach (@line) { $flag = 0; foreach $wd (@wd) { if (index($_,$wd) >= 0) { $flag = 1; if ($in{'cond'} eq 'OR') { last; } } else { $andor="and 検索"; if ($in{'cond'} eq 'AND') { $flag=0; last; } $andor="or 検索"; } } # ヒットした場合 $view = $in{'viewc'}; if ( $view eq '' ) { $view = $views } if ($flag) { $i++; next if ($i < $page + 1); next if ($i > $page + $view); push(@find,$_); } } # 検索終了

    • ベストアンサー
    • CGI
  • 条件のAND検索??

    条件のAND検索?? 現在 □豊岡市 □神戸市 □篠山町 みたいなチェックボックスの検索システムが有ります。 これを 地域(カラム=jyusyo) □豊岡市 □神戸市 □篠山町 予算(カラム=kakaku) [ 円]~[ 円](option属性) と新たに付け加えたいです。 現在の検索システムのソースは $jyusyo=$_POST["jyusyo"]; $jyusyonum=array("豊岡市","養父市","朝来市","神戸市","姫路市"); $query = "select name,jyusyo,kakaku,gazou,link from kensaku where"; if($jyusyo != "") { foreach ($jyusyo as $value) { $like .= "'" . $value . "',"; } //最後の , を削除 $like = substr($like, 0, -1); $query = $query . " jyusyo in ($like) "; } をどのように変更したら良いですか?? 試行錯誤しましたが、それらをここで説明したら長くなるので書きませんが丸投げしてるわけでは御座いません。よろしくお願いします。

    • ベストアンサー
    • PHP
  • perlの質問

    #!/usr/local/bin/perl require 'jcode.pl'; # 漢字コード変換ライブラリ #********** データを受け取る $query = $ENV{ 'QUERY_STRING' }; &parse_param( $query ); $name = $param{ 'name' }; # 投稿者 $email = $param{ 'email' }; # メールアドレス #********** 結果の出力 print "Content-type: text/html\n\n"; print "投稿者:".$name."<BR>"; print "メールアドレス:".$email; exit; #********** 入力したデータの分解 ********** sub parse_param {  local( $name, $value );  local( $parse_data ) = @_;  @in_params = split( /&/, $parse_data );  foreach $in_param ( @in_params ) {   ( $name, $value ) = split( /=/, $in_param );   $value =~ tr/+/ /;   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;   &jcode'convert( *value, 'sjis' );   $param{ $name } = $value;  } } の $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack の部分だけ、何の処理をしているかがいまいちわかりません。 わかる方お願いします。

    • ベストアンサー
    • Perl
  • 単語ではなく複数語検索

    $usersearch =$_POST['usersearch']; $query = "select byou,syou from kensaku2 where syou like '%{$_POST['usersearch']}%' OR syou like '%{$_POST['usersearch']}%'"; $where_list = array(); $search_words = explode(' ', $usersearch); foreach ($search_words as $word){ $where_list[]= " syou like '%$word%'"; } $where_clause = implode('or',$where_list); if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } $result = mysql_query($query); while($row = mysql_fetch_array($result)){ echo '<strong>ドリンク:</strong>' . $row['byou'] . '<br/>'; echo '<strong>野菜:</strong>' . $row['syou'] . '<br/>'; } 上記のものでテキストボックスに[コーラ お茶]等の複数のワードで検索し、その二つに該当するデータを取り出したいのですが、上手くいきません(単語でないと検索できません)。改変部分等御指摘下さい。

    • ベストアンサー
    • PHP

専門家に質問してみよう