• ベストアンサー

書き込み時に勝手にクリアさせない記述

ログファイルをHTMLにして、 HTMLの中の<!--START-->から<!--END-->に書き込み 処理していくというようなでチャットを作っています。 その中で、書き込み処理の内容を下記のように書いて local($job) = @_; open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = <IN>; close(IN); $i=0; $match=0; @temp=(); foreach (@lines) { chop($_); if ($match) { $i++; push(@temp,"$_\n"); } elsif ($_ eq '<!--START-->') { $match=1; } if ($i > $logs-2 || $_ eq '<!--END-->') { last; } } 記述はこれで間違いないと思ってるのですが 発言フォームでログ数$logsを 選択メニューなどフォームで調整したりすると 書き込むたびに前のログが消えてしまいます。 なぜかわかりません。 どなたか、解決策をご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

$logs = $in{'logs'}; で値が設定されているのは、ログ数が入っているのですか? それとも別の意味の変数なのでしょうか #2さんと同じく &renew_log; $logs=@line の $logs=@line の部分(@linesを@lineなのは、私の間違いですね、すみませんm(_ _)m)が foreach (@lines) { より前にないといけないと思います。 (&renew_log; は一緒にもってきてはいけません) あと renew_logで close(IN); してるのは、 close(OUT); ですよね。

その他の回答 (2)

  • arcsin
  • ベストアンサー率70% (28/40)
回答No.2

$logs = $in{'logs'}; の部分でちゃんと $logsに値が入っているかどうか確認してみてください。ファイルに書き込みをしていない適当な場所で&error($logs);等してブラウザに変数の値を表示させる等するといいかもしれません。 また、 &renew_log; $logs=@line; の部分は#1さんのアドバイスでいれたものですか?(たぶん@linesの書き間違いですよね?) もしそうであれば$logs=@lines;の位置が下すぎると思います。上のforeachより上に書かなければ・・・

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

このソースからだと、 ファイルに書き込んでいる所がないので、 わからないです。 このソースでは、少なくとも $logsに値が設定されていませんよね。 $logs=@line みたいなコードがどこかに必要だと思います。 あと、ファイルを書き込みでオープンする時に、 追加(>>)でオープンしているか? など

tuluw
質問者

補足

色々書くところ足りなくてすいません。 とりあえず大体書き出してみます。長くてすいません。 # ログ書込処理 # sub regist { local($job) = @_; # 日時の取得 $ENV{'TZ'} = "JST-9"; $times = time; ($sec,$min,$hour,$mday,$mon,$year) = localtime($times); $date = sprintf("%1d/%1d %2d:%2d",$mon+1,$mday,$hour,$min,$sec); # ログ形態を判断 if ($job eq 'into') { $in{'comment'} = "$in_msg"; $name = $in{'name'}; $ncolor = $in{'ncolor'}; $scolor = $in{'scolor'}; } elsif ($job eq 'bye') { $in{'comment'} = "$out_msg"; $name = $in{'name'}; $ncolor = $in{'ncolor'}; $scolor = $in{'scolor'}; $size = $in{'size'}; } else { $name = $in{'name'}; $ncolor = $in{'ncolor'}; $scolor = $in{'scolor'}; $size = $in{'size'}; $logs = $in{'logs'}; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = <IN>; close(IN); $i=0; $match=0; @temp=(); foreach (@lines) { chop($_); if ($match) { $i++; push(@temp,"$_\n"); } elsif ($_ eq '<!--START-->') { $match=1; } if ($i > $logs-2 || $_ eq '<!--END-->') { last; } } # ログ更新処理 &renew_log; $logs=@line # 参加者機能 &sanka; # 内容表示 if (!$job) { &header; print "<META HTTP-EQUIV=\"refresh\" CONTENT=\"$rtime; URL=$chat_log\"></head>\n$body\n"; print "参加者-$member:$num$sikiri\n"; print "<font color=\"$ncolor\">$name</font> &gt; <font color=\"$scolor\" size=\"$size\">$in{'comment'}</font> ($date)$sikiri\n"; print @temp; print "</body>\n</html>\n"; exit; } } #----------------# # ログ更新処理 # #----------------# sub renew_log { open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT "<html><head>\n"; print OUT "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n"; print OUT "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=Shift_JIS\">\n"; print OUT "<META HTTP-EQUIV=\"refresh\" CONTENT=\"$rtime; URL=$chat_log\"></head>\n$body\n"; # 参加者表示 print OUT "参加者-$member:$num$sikiri\n<!--START-->\n"; print OUT "<font color=\"$ncolor\">$name</font> &gt; <font color=\"$scolor\" size=\"$size\">$in{'comment'}</font> ($date)$sikiri\n"; print OUT @temp; close(IN); } 「$logs=@line」も入れてみたのですが やはり書き込み時にログがクリアされてしまいます。 どこを変えたらいいのでしょうか、 よろしくお願いします。

関連するQ&A