- ベストアンサー
push命令って…
掲示板で、投稿数が多くなりすぎないように1ページに表示される数を制限して(例えば30件だけ)それ以上の件数になったら隅のほうにでも「1/2/3/次のページ/」などと表示して前のログを見れるようにしたいと思いそのようなのを作っているんですが何度やってもうまくいきません…。よろしければヒントなどをいただきたいと思います。 と、本題が遅れましたが…。 $cutnum=$cnt - $max; #切り取る数を指定 $i=0; foreach $line (@all){ push (@old,$line); #→例えばanswer.datのログを読み上の行から読み取り。 $i++; if($i eq $cutnum){last;} #→@allから$cutnum個のデータを読み取ったら抜ける } open (Old,">bbs1.dat"); print Old @old; close (Old); として、表示される最大数からあふれたのをひとつずつ過去ログとして保存するようにしたんですが、bbs1.dat には 投稿数を増やしていくと 5,2002年2月17日,Ryo,メアド 4,2002年2月17日,Ryo,メアド 3.2002年2月17日,Ryo,メアド 2,2002年2月17日,Ryo,メアド 1,2002年2月17日,Ryo,メアド とどんどんどんどんずれていってしまいます…。どうにかならないものでしょうか? 質問がわかりづらいかもしれないですがどうかよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
いろんな方法が考えられますが、 一番感覚的に分かりやすい方法を・・・ $max = 50; (例えば、最大50件とすると) ここで、ファイルから読みとり、、、@linesに入れて、 foreach $no(0 .. $#lines){ if ($no >= $max){ push(@olds,$lines[$no])} else { push(@now,$lines[$no])} } とすれば、最大件数までは、@nowに格納→BBS表示に使い、 それ以上の部分があれば、@oldsに格納→olds.datへ追加書き込み→これからの 読みとり&過去ログ表示は定番のやり方で。 とすればいけると思います。 そのほか、書き込みは一件ずつって事を考慮すれば、書き込み段階で popして出た分ずつ過去ログファイルに追加書き込み。。。とも出来るかと思います。 細かい処理にはふれないでおきます。 あくまで参考程度に。
その他の回答 (1)
- yuizuian
- ベストアンサー率42% (103/245)
$lineの中がどのようになっているのかわからないので回答が難しいのですが、一旦ブラウザに配列の中身を吐き出してデバッグしてみてはいかがでしょう? それから、ついでのおせっかいなのですが、 せっかく$iを使ってか数をカウントされているので push (@old,$line); ↓ $old[$i] = $line; とされてはどうでしょう? それから if($i eq $cutnum){last;} は if($i > $cutnum) {last;}の方が安全ですよね。