#!/usr/local/bin/perl # $Id: search-2.cgi,v 1.2 2006/02/04 07:11:40 68user Exp $ use strict; require 'jcode.pl'; my $start_time = times(); $|=1; my @keywords; # 検索対象となるキーワード # 引数解析 foreach ( split(/&/, $ENV{QUERY_STRING}) ){ my ($name, $value) = split(/=/, $_); if ( $name eq 'keyword' ){ $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode::convert(\$value, 'euc'); # 前後の空白を削除 my $jisx0208_space = ' '; $value =~ s/^(\s|$jisx0208_space)+//; $value =~ s/(\s|$jisx0208_space)+$//; foreach my $keyword (split(/\++/, $value)){ push(@keywords, $keyword); } } } print "Content-type: text/html; charset=EUC-JP\n\n"; print qq(\n); print "

全文検索その2: index 関数で各キーワードを検索

\n"; if ( scalar(@keywords) == 0 ){ print "検索キーワードが入力されていません。\n"; print "\n"; exit 1; } printf("

FreeBSD-users-jp を「%s」で検索します。

\n", escape(join(' ', @keywords))); my $freebsd_users_jp_url = 'http://home.jp.freebsd.org/cgi-bin/showmail/FreeBSD-users-jp'; # メールのファイル名を @files に格納 my $maildir = '../../freebsd-users-jp'; opendir(DIR, $maildir); my @files = grep(/^[0-9]+$/, readdir(DIR)); my $found_filenum = 0; # マッチしたファイル数 my $max_found_filenum = 100; # これ以上マッチしたら検索を打ち切る FILELOOP: foreach my $filename (sort {$a <=> $b} @files){ my %match_line; my %already_found; open(IN, "$maildir/$filename"); my $buf = join('', map { s/\r\n/\n/; $_; } ); close(IN); foreach my $keyword (@keywords){ my $pos = index($buf, $keyword); if ( $pos >= 0 ){ # キーワードが見つかった。 my $line_start_pos = rindex($buf, "\n", $pos)+1; my $line_end_pos = index($buf, "\n", $pos)-1; $match_line{$line_start_pos} = substr($buf, $line_start_pos, $line_end_pos-$line_start_pos+1); } else { # 見つからなかったらそこで打ち切って、次のファイルへ。 next FILELOOP; } } # ここまで到達したということは、全てのキーワードが見付かったということ print qq($filename
\n); foreach my $pos ( sort {$a<=>$b} keys %match_line ){ $_ = $match_line{$pos}; printf("     %s
\n", escape($_)); } $found_filenum++; if ( $found_filenum == $max_found_filenum ){ last; } } print "

\n"; print "$found_filenum 件見付かりました。\n"; if ( $found_filenum == $max_found_filenum ){ print "$max_found_filenum 件見つかったので、検索を打ち切りました。"; } print "

\n"; printf("ユーザモード CPU 消費時間: %.2f秒\n", times()-$start_time); print "\n"; exit 0; #----------------------------------------- sub escape { my ($str) = @_; $str =~ s/&/&/g; $str =~ s//>/g; $str =~ s/ / /g; return $str; }