• 締切済み

if構文でAND検索

サイト内検索で”空白で区切った単語が全て含まれるページを表示”する「AND検索」を、簡単なサイト登録型の検索エンジンのカテゴリ検索で同じようなことを実行したいのです。 たとえば、@list内に サイトA,素材,壁紙, サイトB,素材,リンク, というような2つのサイトが登録されていたとして、 下のように処理します。(一部略 print <<EOD; <select name="s1"> <option value="素材">素材 <option value="壁紙">壁紙 <option value="リンク">リンク </select> <select name="s2"> <option value="素材">素材 <option value="壁紙">壁紙 <option value="リンク">リンク </select> <input type="submit"> EOD require 'cgi-lib.pl'; &ReadParse(*form); $s1=$form{'s1'}; $s2=$form{'s2'}; foreach(@list){ ($site,$content1,$content2)=split(/\,/); *** } ここで「OR検索」なら、***の部分に if(($s1 eq $content1)|| ($s1 eq $content2)|| ($s2 eq $content1)|| ($s2 eq $content2)){ print "$site<br>"; } このようにすれば、例えばセレクトボックスで 「素材」を選択→「サイトA」「サイトB」 「壁紙」を選択→「サイトA」 「壁紙」と「リンク」を選択→「サイトA」「サイトB」 が表示されます。 ですが、「AND検索」はif構文をどのように組めばいいのでしょうか? 結果的には 「素材」を選択→「サイトA」「サイトB」 「素材」と「壁紙」を選択→「サイトA」 「壁紙」と「リンク」を選択→(なし) としたいのですが、どうすればいいのか分かりません。 初心者で説明不足かもしれませんが、よろしくお願いします。

みんなの回答

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.4

No.3です。 foreach(@list){ ($site,$content1,$content2)=split(/\,/); *** } の部分をLABELで始まるループに置き換えます。 カテゴリーは$s1,$s2に入ってますよね?それを表示してください。

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.3

なんかごちゃごちゃしてしまいましたが、(^^; こういうようなやり方ではどうでしょうか。 LABEL : foreach (@list) { my %hash; my @list2 = split /\,/; $hash{'site'} = shift @list2; foreach (@list2) { $hash{$_} = 1; } foreach ($s1, $s2) { next if not $_; next LABEL if not $hash{$_}; } print "$hash{'site'}<br>"; } もし $s3 , $s4・・・と増えていっても大丈夫かと。

is_may
質問者

補足

すみません、編集方法が分かりません。 一致した場合、「壁紙」などのカテゴリも表自体のですが、 どのようにすればいいでしょうか よろしくお願いします。

  • feininger
  • ベストアンサー率41% (74/180)
回答No.2

ANDの場合、「キーワードが含まれていない」と判断した時点でnextしてしまうと楽です。 こんな感じになります(汎用性はまったくないですけど) my @list = (); push(@list,'サイトA,素材,壁紙'); push(@list,'サイトB,素材,リンク'); LOOP:foreach (@list) {  my ($site,$content1,$content2) = split(/\,/);  if (($content1 ne '素材') && ($content2 ne '素材')) {next LOOP;}  if (($content1 ne '壁紙') && ($content2 ne '壁紙')) {next LOOP;}  print $site; } 今回のケースだと、split()でいきなりバラバラにするより、 検索したい部分を抜き出してからindex()で検索したほうが効率は良さそうですね。

is_may
質問者

補足

登録するサイトが増え続けると push(@list,'サイトA,素材,壁紙'); push(@list,'サイトB,素材,リンク'); の部分の処理はどうすればいいのでしょうか?

  • to_kyo
  • ベストアンサー率41% (7/17)
回答No.1

if ($content1 =~ /$s1|$s2/ && $content2 =~ /$s1|$s2/){ print 'match'; } でイケルと思います。 undefinedのwarning等には考慮してません。 各変数が定義されていない場合はうまく動かないこともありえます。 要テスト、ということで。 O'REILLYの「初めてのPerl」を1回読んで練習問題解くと perlで一通り単純なことはできるようになりますので オススメです。 perlの特性を使いこなすまではいかないかもしれませんが。

is_may
質問者

補足

やって見ましたが、検索結果が「AND検索」と少し違うようです。 他の方法はありませんか? できればよろしくお願いします。

関連するQ&A