• 締切済み

logファイルをひらいての処理の仕方を教えてください。

データベース検索のperlをカスタマイズ中です。 ユーザが入力したものを、検索条件のひとつにしたいのですが、表示されません。 インプットしたものはlogファイルに書き込まれるので、それを開いて反映させればいいのだろうということまでは、なんとかわかるのですが、どのように表記していいのか・・・今はない知恵を絞ってこのように表記しているのですが。 if (!open(FD,"$logfile")) { &error(0); } @lines = <FD>; $cnt = @lines; close(FD); print "<select name=P2 >\n"; print "<option value=\"0\" selected>指定なし\n"; $i =0; foreach $line (@lines) { ($no,$sub,$com1,$com2,$com3,$p1,$p2,$p3,$p4) = split(/\,/,$line); chop; if ($p2 ne '') { $i++; $p2s{($p2)[0]}++; $n++; } } foreach (keys %p2s) { print "<option value=\"$_\">$_\n"; } print "</select></td>\n";

  • bori
  • お礼率67% (40/59)
  • Perl
  • 回答数2
  • ありがとう数6

みんなの回答

  • vmlinuz
  • ベストアンサー率30% (4/13)
回答No.2

その 「ERROR!」という表示が、1行目にある「&error(0);」によるものであるとすれば、ファイルが開けてないんでしょうね。spell miss とかないですか?

bori
質問者

補足

ええっと、その後いろいろいじっていたら、どうも表示した場所がわるかったらしくエラー表示はでなくなりました。(^^ゞ しかし、やはり、プルダウンメニューには、opution value=0の指定なしという表示しかされません。せめて、logファイルを読み込んでいるのかどうかの確認がとれればとも思います。 よろしくお願いします。

  • y_oku
  • ベストアンサー率62% (25/40)
回答No.1

えと。 ユーザの入力したものはlogファイルに書き込まれていて、 その形式は ($no,$sub,$com1,$com2,$com3,$p1,$p2,$p3,$p4) を「,」で区切ったものなんですね。 大まかなやりたいことが書いてあるのは大まかな方針が立つので とてもよいことです。 んで、細かく最終的にやりたいことも、もう少し書いてあると 助かるんで補足してください。 (ていうか最初からそこまで書いてあるほうがいいですよ。 表示されません。じゃ参考にならないです) log.txt----------------- 1,s,c1,c2,c3,p1,p2_1,p3,p4 2,s,c1,c2,c3,p1,p2_2,p3,p4 3,s,c1,c2,c3,p1,,p3,p4 4,s,c1,c2,c3,p1,p2_4,p3,p4 ------------------------ みたいな入力をどうしたいですか? ------------------------ <option value="p2_1">p2_1 <option value="p2_2">p2_2 <option value="p2_4">p2_4 ------------------------ たとえば、上のようになればいいだけなら、 boriさんのプログラムでも動いているようですよ。:) 現在のプログラムがどんな出力をしているのかは調べましたか?

bori
質問者

お礼

補足などもしましたが、「できてますよ」のひとことを信じていろいろ試して while(<IN>){ を使ったらできるようになりました。 ありがとうございました。

bori
質問者

補足

すいません、説明不足で・・・ 出力を確認すると、エラー表示がでるのです。 ■ 業 務 Content-type: text/html ERROR ! 0 というふうに。■業務というのが、いわゆるp2の中身というか、今回表示させたいものなのですが・・・このタイトルの下にプルダウン形式で入力したものを表示させて、検索キーのひとつにしたいのです。 したいことは、y_okuさんが理解してくださっているとおりです。 よろしくお願いします。

関連するQ&A

  • ユーザ入力が表示されない原因を教えてください。

    CGI初心者です。基礎を勉強しただけなのでまだまだ理解が足りないせいかもしれません。現在データ検索のカスタマイズをしています。 ユーザが入力したものを検索条件の一部にと考えているのですが、なかなかできません。どこがいけないのかおしえていただけないでしょうか? インプット print "<P>● 業 務 <input type=text name=P2 size=30>\n"; アウトプット print "<td valign=top nowrap><font color=\"$t_color\">■</font> <B>業 務</B><br>\n"; print "<select name=P2 >\n"; print "<option value=\"99\" selected>指定なし\n"; $i =99; foreach $line (@lines) { ($name,$value) = split(/\,/,$line); chop; if ($name ne '') { $i++; $names{($name)[0]}++; $n++; } } foreach (keys %names) { print "<option value=\"$_\">[$_]\n"; } print "</select></td>\n"; と表記してます。クッキーを利用して反映できるようにはしていて、 入力したものを、登録内容の確認や、削除するときやメンテするときにはちゃんと表示されています。

  • cgiログファイル分割について。

    ログファイルを開いて変数に代入しています。 $i=0; foreach(@files){ @log = split(/&/,$files[$i]); ($key1,$value1,$key2,$value2,$key3,$value3,$key4,$value4) = split(/=/); : のようにしました。 print "$key2<BR>\n"; などとしても ***&*** と出てしまいます。 その上で&で分割しているのに何故でしょうか?

    • ベストアンサー
    • CGI
  • ページ処理

    毎度お世話になってます 同じような質問を数回させていただいたのですが 自分の技量不足のため上手く行きませんでした なので再度質問の形を変えてお聞きさせていただきます 今以下のようなコーティングでデータベースを 作成しています その際のページ処理が上手くいきません どのように上手くいかないかというと マッチしたサイト全てが検索結果に表示されてしまいます このコーティングをベースに構成したいのですが 何とかなりますでしょうか? $view=2; sub subtwo {open(fp,"log.txt"); @lines = <op>; close(op); $bigin = $in{"page"} * $view; $end = $bigin + $view; if($i !~ /\d+/){$i = 0}; if($open eq "") {foreach $line (@li) {($abc,$def,$ghi,$jkl,) = split(/,/,$line); $chk = 1; foreach $k (@key) {if(index($line,$k,)<0) {$c = 0; last}} if($c>0) {print "<A HREF=\"$abc\">$def</A><br>\n";<br>\n";}}}} ############################################ sub subthree {$bigin = $in{"page"} * $view; $end = $bigin + $view; if($end<$マッチした総数の変数) {$nextpage=$in{"page"}+1; print qq(<FORM method="get" action="kensaku.cgi"> <INPUT TYPE=HIDDEN NAME="page" VALUE="$nextpage"> <INPUT TYPE="SUBMIT" VALUE="next"> </FORM>\n);} if($bigin>0) {$backpage=$in{"page"}-1; print qq(FORM method="get" action="kensaku.cgi"> <INPUT TYPE="HIDDEN" NAME="page" VALUE="$backpage"> <INPUT TYPE="SUBMIT" VALUE="back">\n);} if($page<0) {$page=0} }

  • ログファイルと受信データを比べたい。

    フォームを使用して送られてきたデータをlogを比べて同じものがあったら、同じものがあるということを表示したいのです。 前にも同じようなことをしてできたはずなのですが、なぜかできなくて…。 もうずーっとやっていて頭がボーッとしてきてしまいました。。。。 #フォームで受信したデータ read(STDIN,$buffer,$ENV{'content_length'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #ログファイルオープン open FILE,"naisen.log"; @FILES =<FILE>; close FILE; $i=0; $n=0; $gyou = @FILES; #文末の改行を削除 $buffer =~ s/\n$//; $FILES[$i] =~ s/\n$//; foreach(@FILES){ @log = split(/&/,$FILES[$i]); ($keys,$values) = split(/=/,$log[$_]); $FORMS{$keys} = $values; } for ($i=0; $i<=$gyou-1;$i++){ if ($buffer eq $FILES[$i]){ print "$i行目<BR>\n"; } else{ print "$i行目。これはありません。<BR>\n"; print "$FILES[$i]<BR>\n"; print "$buffer<BR>\n"; } } ログの1行目と同じものとときだけ、きちんとした結果がでます。 上記のほかにもいろいろやりましたができませんでした。

    • ベストアンサー
    • CGI
  • 検索結果の表示形式を表形式にしてだしたいのですが・・・

    CGI初心者です。データベース検索のCGIをフリーからカスタマイズをかけて利用を試みています。今の状態では、検索結果が、 print "<LI><a href=\"$script?mode=view&no=$no\">$sub</a>\n"; 状態で表示されます。 が、これをメンテするときの一覧状態にしたいのです。 メンテ時の表示プログラムは、 # 管理画面を表示 &header; $count = @lines; print "<center>\n"; print "<form action=\"$script\" method=\"$method\">\n"; print "<input type=hidden name=pass value=\"$in{'pass'}\">\n"; print "<input type=hidden name=mode value=\"admin\">\n"; print "<input type=hidden name=action value=\"delete\">\n"; print "<table border=1 cellspacing=1><tr>\n"; print "<th>削除<th>料理名<th>食種<th>食材<th>調理法<th>コメント</tr>\n"; foreach $line (@lines) { local($no,$sub,$com,$p1,$p2,$p3) = split(/<>/, $line); $com =~ s/<br>/ /g; $com =~ s/</&lt;/g; $com =~ s/>/&gt;/g; if (length($com) > 60) { $com = substr($com,0,58); $com = "$com" . '..'; } print "<tr><th><input type=checkbox name=del value=\"$no\"></th>"; print "<td><b><a href=\"$script?mode=mente&no=$no\">$sub</a></b></td>"; print "<td>$part1[$p1]</td><td>$part2[$p2]</td><td>$part3[$p3]</td>"; print "<td><small>$com</small></td></tr>\n"; } print "</table><P>\n"; です。どうしたら、メンテ時のような一覧の表形式で表示できるのでしょうか? あと、あまりに言語がわからないので、なにか良い参考書及びHPがあれば教えてください。

    • 締切済み
    • CGI
  • チャットCGIの編集について

    あるチャットのCGI編集しています。編集したい内容はチャットで発言したときに日時を付加して表示したいということです。下の$HTMLbuff .=qq([$1] ); と $HTMLbuff .=qq($3<BR><hr>); で$1はname(名前、$2はchat(テキストボックス)に入力された内容を格納していると思うのですが、日時についてはどのように$HTMLbuffに格納し表示したらいいのでしょうか。自分で挿入したところはコメントアウトしています。 #($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); #$year += 1900; #$mon += 1; #$date = sprintf(" ($mon/$mday $hour:$min:$sec)"); $HTMLbuff .=<<"_HTML_"; <INPUT TYPE=hidden NAME="name" VALUE="$name"> <INPUT TYPE=hidden NAME="window" VALUE="$window"> <INPUT TYPE=text NAME="chat" SIZE="80"> #<INPUT TYPE=hidden NAME="date" VALUE="$date"> <BR> <INPUT TYPE=submit VALUE="発言・更新"><A HREF="$URL?name=$name&out=out">退室</A>参加$sanka_num<hr></FORM> _HTML_ &readlog if (!@lines); $window=20 if (!$window); (@lines < $window) || (@lines = @lines[0 .. $window - 1]); foreach $line (@lines) { $line='' if($line=~/$FORM{'F'}/ && length($FORM{'F'}) >2);#filter機能 next if($line =~/^<FONT/);#電報の場合、<FONTの前にホスト名が入っている。 next if($line =~/^<img/);#電報の場合、<imgの前にホスト名が入っている。 ($host2,$dmy) = split(/<FONT/, $line);#ホスト名:名前を取り出す。 #($host2,$dmy) = split(/<img/, $line);#ホスト名:名前を取り出す。 if(("$host:$name" eq $host2) || ((index($line,$name)>=0) && (index($line,$host)>=0) ) ){ $line=~s/([^<]*)(.*)/$2/; } else{$line = '';} }#foreach(電報のフィルタリング foreach $line (@lines) { next unless($line); $line=~s/<[^>]*>//ig;#タグの抜き取り $line=~s/</&lt;/ig; $line=~s/>/&gt;/ig; $line=~ /^([^\s]+) (&gt;|\|&gt;) (.+)\(\d+\/\d+\(.+\).+\).*\n$/; $HTMLbuff .=qq([$1] ); $HTMLbuff .=qq($3<BR><hr>); } if($HTMLlen >1200){ $HTMLbuff = substr($HTMLbuff,0,1200); $HTMLbuff =~ s/<BR>[^>]+$//; $HTMLbuff .="○</DISPLAY></HDML>"; $HTMLlen = length($HTMLbuff); } print "Content-Type: text/x-hdml; charset=Shift_JIS\n"; print "Content-Length: $HTMLlen\n\n"; print $HTMLbuff;

    • ベストアンサー
    • CGI
  • CSVデータを読み込み、ファイルにカテゴリを分けて書きこむ

    CSVファイル例 01,0101,○○○,○○○□□,010101, 01,0102,○○○,○○○■□,010102, 02,0201,○○○,○○○□□,020101, ・・・・・ というファイルがあったとすると、 1番目の「01」「02」と、分けて別のファイルに保存がしたいです。 書き込み自体は出来るようなのですが、なぜかループが、番号ごとに1回しかされずに、 log/01.cgi 01<>0101<>○○○<>○○○□□<>010101 log/01.cgi 02<>0201<>○○○<>○○○□□<>020101 となってしまい、全ての生成したファイルには1行しか格納されていません。 ちなみに、csvファイルは1万行近くあります。 ソースはこのような感じです。 $log = "△△△.csv"; # ログ名 $lines = file("$log"); foreach ($lines as $l) { $line = explode(",",$l); $push_line = $line[0]."<>".$line[1]."<>".$line[2]."<>".$line[3]."<>".$line[4]."<>\n"; $LOG[$line[0]] .= $push_line; $cate = $line[0].",,".$line[1]; # サブカテゴリ用 $LOG[$cate] .= $push_line; # カテゴリ用ログを保存 } なお、csvファイルは、 01・・・ 02・・・ 01・・・ 03・・・ のようになっているため、全ての行を読み込むことはしていると思います。 しかし、ログファイルにはなぜか1行分しか書き込まれていません。書き込みの文は以下になります。 foreach($LOG as $key => $value){ $explode = explode(",,",$key); if($explode[0]){ $logfile = "./log/".urlencode($explode[0]).".cgi"; } $file = fopen("$logfile", 'w'); flock($file,LOCK_EX); fwrite($file, $value); flock($file,LOCK_UN); fclose($file); 解決法が分かる方、回答のほどよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 二人目以降から計算がおかしくなってしまうんです。

    質問失礼します。出席管理みたいなものを作っているのですが下記のように13回ループさせて出席した場合はカウントが入りそこから$percent = $count / 13.0 * 100;という計算方法で出席率を出しているのです。 一人目は正常に出てくるのですが、二人目以降から計算がおかしくなってしまいます。 my $gs,$name,$s[1],$s[2],$s[3],$s[4],$s[5],$s[6],$s[7],$s[8],$s[9],$s[10],$s[11],$s[12],$s[13],$sr; open(READ,"2.csv"); #ファイルを読み込む @lines = <READ>; close(READ); #ファイルを閉じる foreach $line ( @lines ){ # @s に 添え字の1から13までに、出席の状態が入る。 ($gs,$name,$s[1],$s[2],$s[3],$s[4],$s[5],$s[6],$s[7],$s[8],$s[9],$s[10],$s[11],$s[12],$s[13],$sr)=split(/,/,$line); print "<tr><td>$gs</td><td>$name</td>"; for($i=1;$i<=13;$i++){ $str = "$gs" . "_" . "$i"; if( $s[$i] eq "1"){ print "<td><input type=\"checkbox\" name=\"$str\" value=\"1\" checked></td>\n"; $count ++; }else{ print "<td><input type=\"checkbox\" name=\"$str\" value=\"1\"></td>\n"; } } $percent = $count / 13.0 * 100; $percent_2 = sprintf "%3.0f",$percent; print "<td>$percent_2%</td></tr>"; } 6人目になると100%が上限なのですが300%などいってしまいます。説明が下手で申し訳ないですが、ご助言いただけないでしょうか?

    • ベストアンサー
    • Perl
  • ログファイル表示で全部表示されたりされなかったり…

    ログファイルをオープン、その中のユーザー名・パスワードと入力されたユーザー名・パスワードを比較して、どちらも一致した場合のみ表示するようなものを作成しました。 ただ単に表示を行うと一致するものすべて表示されるのですが、テーブルなどを使用して表示させると数が減って表示されるのです。 これはいったいなぜでしょうか? ---------- for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach if($FORM{'USER'} eq $FORMS{'USER'}){ if($FORM{'PASSWORD'} eq $FORMS{'PASSWORD'}){ print "$FORMS{'TITLE'}<BR>\n"; print "<BR>\n"; だと全件(19件入力中、一致は18件。18件すべて)表示 一番下を print "<TABLE>\n"; print "<TR><TD>$FORMS{'TITLE'}</TD></TR>\n"; print "</TABLE><BR>\n"; print "<BR>\n"; と変更すると13件しか表示されません。

    • ベストアンサー
    • CGI
  • データの入れ替え処理が巧くできないのですが

    いつもお世話になります 簡単なDBを作っているのですが、データの更新処理が巧くいかなくててこずっています POSTメッソドで送られてきた name=actionの内容がedit2、の時 sub menteが実行されます同じく name=noの変数には更新したいファイルの番号がセットされます それらを取得して、ファイルを開き $nooの内容(DBのファイル番号)とnoが一致したらブラウザから送られてきたデータと その部分のデータ($nooはデータの先頭で以降<>で区切って変数が格納される) を入れ替える処理を行いたいのですがどの様に書いたらいいのでしょうか、下記のコードですと変数 $_に更新される前のデータしか代入できず結果ファイルの入れ替えは行えません open(IN,"$logfile") || &error("Open Error : $logfile"); while (<IN>) { ($noo,@arg_[0..$#eqipument],@p[0..5],$n_article,$w_article,@reselect_marks) = split /<>/; if ($no == $noo ) { $_ = join('<>',$noo,(map{$arg_[$_]}(0..$#eqipument)),$p0,$p1,$p2,$p3,$p4,$p5,$n_article,$w_article,@reselect_marks,),'<>',"\n"; } push(@new,$_); } close(IN); # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); 尚ブラウザから送信されてくるデータは以下のような感じです print qq|<form action=\"$myself\" method=\"POST\">\n|; print qq|<input type=hidden name=mode value=\"admin\">\n|; print qq|<input type=hidden name=action value=\"edit2\">\n|; print qq|<input type=hidden name=no value=\"$no\">\n|; 宜しく御教授お願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう