#!/usr/bin/perl require 'config.cgi'; $thisver = '1.31'; ($script_name) = $ENV{SCRIPT_NAME} =~ /\/([^\/]+)$/; print "Content-type: text/html\n\n"; if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/,$buffer); foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; unless($name =~ /ans/){$FORM{$name} = $value} else{push (@ans,$value)} } } else{ $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $FORM{$name} = $value; } } unless($FORM{n}){$FORM{n}=0} if($FORM{v} && $view_ok){ read_p(); read_q(); header(); log_view(); footer(); } unless(@ans){ read_q(); header(); print_question() } else{ read_p(); read_q(); header(); unless(@ans == @q_data) { error("全ての設問に答えて下さい") } point_cal(); person_ck(); # print_log(); print_result(); } footer(); #--------------------------------------------------------------- sub print_log{ # my ($ans_item,$l_y,$l_n,$l_u,$i); #ログファイルの読み込み open(FILE,"$logfile") or error("ログファイルが開けません!"); @log_data = ; close(FILE); for(@log_data){ chomp; ($l_name,$l_result,$l_ans) = split/,/; if($l_name eq $p_file){$log_ck = 1; last} } #ファイル名がなければ作成 if($log_ck){ $i=0; @l_ans = split(/&/,$l_ans); for(@ans){ ($l_y,$l_n,$l_u) = split(/:/,$l_ans[$i]); if($_ == 1) {$l_y++} elsif($_ == 0){$l_n++} elsif($_ == -1) {$l_u++} $ans_item_temp = "$l_y\:$l_n\:$l_u"; $ans_item .= "$ans_item_temp&"; $i++; } $ans_item =~ s/\&$//; $i=0; @result_item = split(/&/,$l_result); for(0..$who_max+1){ if($result[0] eq $_){$result_item[$_]++} elsif(!($result[0])&&($_ == ($who_max+1))){$result_item[$_]++} $result_item .= "$result_item[$_]\&"; } $result_item =~ s/\&$//; $logvalue = "$p_file\,$result_item\,$ans_item\n"; for(@log_data){ if($l_name eq $p_file){$_ = $logvalue;last} } open(FILE,">$logfile") or error("ログファイルが開けません!"); print FILE @log_data; close(FILE); } else{ # @ansに入っている1,-1,0をそれぞれ # ?:?:?として、さらに全ての項目を&でくっつける for(@ans){ if($_ == 1) {$ans_item .= '1:0:0'} elsif($_ == 0){$ans_item .= '0:1:0'} elsif($_ == -1) {$ans_item .= '0:0:1'} $ans_item .= '&'; } $ans_item =~ s/\&$//; # 次いで判定結果を$result[0]に基づいて # $who_max分&で接続し、該当番号を1にして記録 for(0..($who_max+1)){ if($result[0] eq $_){$result_item .= '1'} elsif(!($result[0])&&($_ == ($who_max+1))){$result_item .='1'} else{$result_item .= '0'} $result_item .= '&'; } $result_item =~ s/\&$//; $logvalue = "$p_file\,$result_item\,$ans_item\n"; open(FILE,">>$logfile") or error("ログファイルが開けません!"); print FILE $logvalue; close(FILE); } } #--------------------------------------------------------------- sub log_view{ open(FILE,"$logfile") or error("ログファイルが開けません!"); @log_data = ; close(FILE); for(@log_data){ chomp; ($l_name,$l_result,$l_ans) = split/,/; if($l_name eq $p_file){$log_ck = 1; last} } unless($log_ck){error("まだ該当するデータがありません")} @l_ans = split(/&/,$l_ans); ($l_y,$l_n,$l_u) = split(/:/,$l_ans[0]); $ans_sum = $l_y + $l_n + $l_u; print qq|総計 $ans_sum 人が参加しました!\n|; print qq|\n


\n|; print qq||; print qq||; $i=1; for(@q_data){ ($l_y,$l_n,$l_u) = split(/:/,$l_ans[($i-1)]); $y_per = ($l_y / $ans_sum) * 1000; $y_per = int($y_per);$y_per /= 10; $n_per = ($l_n / $ans_sum) * 1000; $n_per = int($n_per);$n_per /= 10; $u_per = ($l_u / $ans_sum) * 1000; $u_per = int($u_per);$u_per /= 10; /^(.*)\t.*/; print qq||; print qq||; print qq||; print qq||; $i++; } print qq|
設問はいいいえどちらでもない
|; print qq|問 $i :|; print $1; print qq|$l_y ($y_per\%)$l_n ($n_per\%)$l_u ($u_per\%)


\n|; unless($view_result){return} # print qq|\n
\n|; print qq||; @result_item = split(/&/,$l_result); for(0..$who_max){ next if($result_item[$_] == 0); $r_per = ($result_item[$_] / $ans_sum) * 1000; $r_per = int($r_per);$r_per /= 10; $person = $Personal[ $_ ][0]; $person =~ s/.*$//; print qq||; print qq||; } unless($result_item[-1]==0){ $r_per = ($result_item[-1] / $ans_sum) * 1000; $r_per = int($r_per);$r_per /= 10; $person = "該当資格複数あり"; print qq||; print qq||; } print qq|
|; print qq|$person$result_item[$_]($r_per\%) |; print qq|
|; print qq|$person$result_item[-1]($r_per\%) |; print qq|
\n

\n|; } #追加----------------------------------------------------------- sub person_ck{ for($i = 1; $i <= $f_max; $i++){ $order[$i] = 1; for($j = 1; $j <= $f_max; $j++){ if($point[$j] > $point[$i]){ $order[$i]++; } } } for($i = 0; $i <= $who_max; $i++){ for($j = 1; $j <= $f_max; $j++){ if($order[$j] == $Personal[$i][$j]){ $person = $Personal[$i][0]; goto owari; } } } owari: } #--------------------------------------------------------------- sub person_ck_back{ $i=0; $sum = $f_max * 100; for $i (0..$who_max){ $sum_ck=0; for $j (1..$f_max){ $_ = abs($point[$j] - $Personal[$i][$j]); if($_ > 25){$sum_ck += ($f_max * 100) } #チェック1 else{$sum_ck += $_} } if($sum_ck > ($f_max * 20)){next} #チェック2 print "$Personal[$i][0] = $sum_ck
" if($test); if($sum_ck < $sum){ @result=""; $result[0]=$i; $sum = $sum_ck; } elsif($sum_ck == $sum){ push(@result,$i); } } if($#result > 0){ srand(time ^ ($$ + ($$ << 15))); $result[0] = $result[int(rand(@result))]; } unless(@result){$person = "該当資格複数あり"; $point=""} else{ $person = $Personal[ $result[0] ][0]; $point = 100 - $sum; $point = int($point*10); $point /= 10; $point = qq|${point}%|; } } #--------------------------------------------------------------- sub point_cal{ $i=0; for $ans (@ans){ $q_data[$i] =~ /.*\t(.*)/; @temp = split(/,/,$1); for(@temp){ /(\d+)(.)/; $count[$1]++; $point[$1] += $ans if($2 eq "+"); $point[$1] -= $ans if($2 eq "-"); } $i++; } for(1..$f_max){ next unless($count[$_]); $point[$_] = ($point[$_] / $count[$_]) * 50 + 50; $point[$_] = int($point[$_] * 10); $point[$_] = $point[$_] / 10; print "$point[$_] \% \," if($test); } print "
" if($test); } #--------------------------------------------------------------- sub read_p{ $p_file = "$p_file"."$FORM{n}"."\.$exp"; #データファイルの確定 open(FILE,"$dir$p_file") or error("人格データ開けません!"); @p_data = ; close(FILE); $i=0; for(@p_data){ unless($_){next} next if(/^#/); while(/\t\t/){ s/\t\t/\t/g; } ($who,@fields) = split/\t/; $Personal[$i] = [$who,@fields]; $i++; } $i--; $who_max=$i; $f_max=@fields; } #--------------------------------------------------------------- sub read_q{ my @q_data_temp; $q_file = "$q_file"."$FORM{n}"."\.$exp"; #データファイルの確定 open(FILE,"$dir$q_file") or error("質問データ開けません!"); @q_data_temp = ; close(FILE); chomp @q_data_temp; for(@q_data_temp){ unless($_){next} if(/^#/){next} if(/^\^title=(.*)/i){$title = $1; next} if(/^\^result=(.*)/i){$r_mes = $1; next} if(/^\^result2=(.*)/i){$r_mes2 = $1; next} if(/^\^width=(.*)/i){$width = $1; next} if(/^\^back=(.*)/i){$modoru = $1; next} if(/^\^show=(.*)/i){$show_point = $1; next} if(/^\^comment=(.*)/i){$comment = $1; next} while(/\t\t/){ s/\t\t/\t/g; } push(@q_data,$_); } } #--------------------------------------------------------------- sub print_result{ my $message; $r_mes =~ s/\$point/$point/; $person =~ s/\$point/$point/; $r_mes2 =~ s/\$point/$point/; $message = $r_mes . $person . $r_mes2; print < $message HTML } #--------------------------------------------------------------- sub print_question{ $comment ||= "以下の設問に全て答えてからボタンを押して下さい"; print "$comment\n"; print qq|

\n|; print qq|\n|; print qq|\n|; $i=1; for(@q_data){ unless(/^(.*)\t.*/){ print qq|\n\n|; $i++; } print qq|
|; print qq|$i番目の質問データ 区切りタブがありません|; } else{ print qq|
|; print qq|問 $i :|; print $1; } print qq||; print qq|はい |; print qq|いいえ |; print qq|どちらでもない | unless($nitaku); print qq|
|; print qq|
|; print qq|
|; } #-----------------ヘッダー-------------------------------------- sub header{ if($title eq ""){$title="Personality"} print < $title
$title
HEAD print "
"; } #----------------フッター-------------------------- sub footer{ print <
FOOTER exit; } #-------------------エラー出力---------------------- sub error { print< エラー

ERROR!!

$_[0]

ERR_M exit; } #--------------------------------------------------- #----------------------------------------------------------------- # Original Source (C)まかまか般若波羅蜜 #-----------------------------------------------------------------