痔になりやすい生活習慣とは?

度々質問失礼します。
前回は「掲示板の表示件数の制限を無くすこと」でお世話になりました。

今回は表示件数を10件だけにしまして、それ以降の件数は削除をせずに、「次の表示」ボタンを押すと次の10件が見えるようになるようになるのに挑戦しています。

が、「次の表示」ボタンを押す以前に「10件だけを表示させる」事がうまく動作できずに困っています。

sub outputMsgData{
#print the messages in the data file
open(IN,"$DATA_FILE_NAME");

while(<IN>){

     中略

}
close(IN);
print"</body></html>\n";
}

while文のところで色々試しているのですが
10件表示されても掲示板に書いた内容が表示されなかったり。何にも表示されなくなったりと困っています。
すみませんが、ご助言&プログラムの追記等よろしくお願い致します。

A 回答 (3件)

私だとこんな感じですかね。



# 配列@dataにデータを取得
open(IN,"$DATA_FILE_NAME");
@data = <IN>;
close(IN);

# 開始位置と終了位置を取得
# 開始位置はxxx.cgi?p=1のように指定
$start = $in{'p'}*10; # ここの書き方は状況に合わせて
unless ($start) {
$start = 0;
}
$end = $start + 9;

for ($start..$end) {
(中略。$data[$_]からデータを取得してお好きなように)
}

んで、「次の10件」は
$next = $in{'p'} + 1;
print "<a href=\"xx.cgi?p=$next\">次の10件</a>";
みたいな感じで。

一度全データを格納するので、巨大なファイルになるとメモリ問題が発生するかもしれません。
    • good
    • 0

簡単なのが、for文を使う事かなー。



最初は、$next = 0;
次ぎボタンを押されたら、$next = $next +10;
$max = $next +10;

for($i=$next; $i<$max; $i++){
 list($no,$title,$kome) = explode("<>",$data[$i]);
 print "$title,$kome";}

で、次ぎのボタンを押した時に、$maxにプラス10する。
これで、$nextから$max(プラス10個分)まで、表示される。
ボタンが押されれば10-20まで。

シンプルな掲示板を2,3探して、それを見るのも手。

前の10を見るボタンを表示するや、すべてのデータを表示しきったら次ぎボタンを表示しない等の細かな条件が必要なので、説明よりは実際見た方が早い。
多少面倒なので書かないけど。

while(<IN>){だと、すべてのデータを読み込んじゃうから、
if(見たいNo){print "条件にあってる";}
//見たくないNoは何もしない。}

で、見たいNoが1-10までならいいけど、121-130だと120までのループ処理が無駄になっちゃうから、無駄な負荷。
$data[$i]でも、メモリー容量喰う気がするけど、最後に配列の内容をクリアーすれば問題ないかな?
あまり偉そうな事は言えないけど、負荷を低く、ループは短く、メモリーの事を考えると、初心者から一歩前進。
    • good
    • 0

そのファイルには1行1件で入っているということですよね?


ならばこんな風にカウントすれば良いだけでは?

my $count = 0;
while (<IN>) {


  (略)


 $count++;
 last if ($count >= 10);
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング