#!/usr/local/bin/perl #日本語コード変換ライブラリ #ダウンロード先↓ #ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/ require './jcode.pl'; #フォームデコード用ライブラリ #ダウンロード先↓ #http://www.bio.cam.ac.uk/cgi-lib/ require './cgi-lib.pl'; #あらかじめ用意してあるデータから必要なデータを絞り込み取り出します。 #検索系の機能が欠かせません。 #個kでは、Perlの関数やその他もろもろを検索できるようにしました。 $title = 'Perl-etc DB'; #書き込みデータの位置 $data_file = './data/d-basic.csv'; #カテゴリーファイルの位置 $category_list = './data/d-category.txt'; #当スクリプト $script_file = './d-basic.cgi'; #新着表示件数 $newlist = 10; #データオープン $file_no = 0;#データファイルの有無 if (!open(DATA,$data_file)) { $file_no = 1; } @lines = ; close(DATA); #cgi-lib.plの関数。これを呼び出すとフォームの内容が%inに格納される &ReadParse; if ($in{'mode'} eq "search" && ($in{'searchtext'} || $in{'category'})){ #検索結果表示 &searchlist; }elsif($in{'mode'} eq "data"){ #内容詳細表示 &dataview; }else{ #初期ページ表示 &printdata; } ########################################################### #ページ表示 sub printdata { #カテゴリーファイルオープン $c_file_no = 0;#カテゴリーファイルの有無 if (!open(C_DATA,$category_list)) { $c_file_no = 1; } @category = ; close(C_DATA); &head; print "

新着($newlist件)

"; #表示データの保存用 %datelist; if($file_no == 1){ print "データファイルはありません"; }else{ foreach $line (@lines) { #DATA形式 ID,項目,カテゴリ,解説,使用例,追加/修正年月日,リンク,関連項目,公開・非公開 ($id,$subject,$category,$explanation,$case,$date,$refer_link,$related,$open_yn) = split( /,/, $line); #「追加/修正年月日+ID」をキーにして連想配列に必要データだけ入れなおす $datelist{"$date$id"} = "$id,$subject,$category,$date\n"; } #表示データの項目数のカウントとキーで並べ替え $count = keys %datelist; @keyreturn = keys %datelist; @keysorted = sort { $b cmp $a} @keyreturn; $keycount = 0; if(%datelist){ #テーブルに整形して出力 print ""; print ""; foreach $linekey (@keysorted){ $line = $datelist{$linekey}; chomp $line; #表示した件数が、指定した新着表示件数($newlist)を超えたらおわり $keycount++; if($keycount > $newlist){last;} #表示データが空ならスキップ if(!$linekey){next;} #DATA形式 ID,項目,カテゴリ,追加/修正年月日 ($id,$subject,$category,$date) = split( /,/, $line); print "\n"; print "\n"; } print "\n"; print "
ID項目カテゴリ年月日-
$id$subject$category$date
\n"; print "\n"; print "\n"; print "
全項目数: $count
"; } } #検索フォームの表示 print "
\n"; print "

検索フォーム

\n"; print "
\n"; print "検索語:
\n"; #カテゴリファイルが無ければカテゴリ選択のプルダウンも無い if(!$c_file_no){ print "カテゴリ:
\n"; } print "\n"; print "\n"; print "
\n"; print "
\n"; print "

他検索項目:候補

\n"; print "
    \n"; print "
  1. 頭文字
  2. \n"; print "
  3. 追加・修正年月日(プルダウン 年/月/日)
  4. \n"; print "
\n"; &foot; } ########################################################### #検索結果表示 sub searchlist { #フォームから検索文字を所得 $s_text = $in{'searchtext'}; $s_category = $in{'category'}; #入力データはタグ対策 $s_text =~ s//>/g; #EUCに変換 &jcode'convert(*s_text,'euc'); &head; #入力データ(@lines)→カテゴリ絞込み結果(@categorylist)→単語検索結果=最終検索結果(%listup;)とデータが渡る #保存用配列・連想配列 @categorylist; %listup; @idlist; print "

検索結果表\示

\n"; #####カテゴリの入力(選択)があったら#################### if($s_category){ #####絞込み#################### foreach $textline (@lines) { chomp $s_category; #DATA形式 ID,項目,カテゴリ,解説,使用例,追加/修正年月日,リンク,関連項目,公開・非公開 ($id,$subject,$category,$explanation,$case,$date,$refer_link,$related,$open_yn) = split( /,/, $textline);#分解 #合致したもののみ保存 chomp $category; if($category eq $s_category){ push @categorylist , $textline; #print "合致した
\n"; }else{ #print "合致しない
\n"; } } }else{ #無かったら絞込みを行わずスルーする @categorylist = @lines; } #####絞込み語の入力があったら#################### if($s_text){ #####絞込み#################### foreach $categoryline (@categorylist) { chomp $categoryline; #DATA形式 ID,項目,カテゴリ,解説,使用例,追加/修正年月日,リンク,関連項目,公開・非公開 ($id,$subject,$category,$explanation,$case,$date,$refer_link,$related,$open_yn) = split( /,/, $categoryline);#分解 &jcode'convert(*categoryline,'euc'); #正規表現で検索するときはeucに変換 #Shift JISの特定の文字は検索などでは文字コードの問題からエラーを起こすので #文字コードを最初からEUCに統一するなどの対策をとればgrepなどの関数が便利 #評価して必要項目のみを渡す if($categoryline =~ /$s_text/){ #タグ対策はデータを保存する際(保存用スクリプト・テキストエディタなど)に考慮すること $listup{$id} = "$id,$subject,$category,$date\n"; push @idlist,"$id\n"; } } }else{ #入力が無かったら絞込みを行わず、必要項目のみを渡す foreach $categoryline (@categorylist) { chomp $categoryline; ($id,$subject,$category,$explanation,$case,$date,$refer_link,$related,$open_yn) = split( /,/, $categoryline);#分解 $listup{$id} = "$id,$subject,$category,$date\n"; push @idlist,"$id\n"; } } ############################################################ if(@idlist){ #テーブルに整形して出力 print "\n"; print "\n"; foreach $listid (@idlist) { chomp $listid; $listtxt = $listup{$listid}; ($id,$subject,$category,$date) = split( /,/, $listtxt); print "\n"; print "\n"; } print "
ID項目カテゴリ年月日-
$id$subject$category$date
\n"; print "\n"; print "\n"; print "
"; }else{ print "該当する項目はありません
\n"; } &foot; } ########################################################### #内容詳細表示 sub dataview { &head; print "

内容詳細表\示

\n"; if($file_no == 1){ print "データファイルはありません\n"; }else{ #テーブルに整形して出力 #・ID,項目,カテゴリ,追加/修正年月日 #・解説 #・使用例 #・リンク,関連項目 print "\n"; foreach $line (@lines) { #DATA形式 ID,項目,カテゴリ,解説,使用例,追加/修正年月日,リンク,関連項目,公開・非公開 ($id,$subject,$category,$explanation,$case,$date,$refer_link,$related,$open_yn) = split( /,/, $line); if($id eq $in{'id'}){ print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } } print "
ID項目カテゴリ年月日
$id$subject$category$date
解説
$explanation
使用例
$case
リンク関連項目
$refer_link$related
"; } &foot; } ########################################################### #エラー表示 sub error { #ローカル変数の設定 #@_は引数の配列 local (@msg) = @_; local ($i); print "Content-type: text/html\n\n"; print <<"EOF"; $_[0]

$_[0]

EOF print "\n"; print "\n"; exit; } ########################################################### #ヘッダ表示 sub head { print "Content-type: text/html\n\n"; print <<"EOF"; $title

$title


EOF } ########################################################### #フッタ表示 sub foot { print "
"; print "戻る"; print "\n"; exit; }