CGI-BBS > CGI > Perl > ログの次行・前行指定で


カレッヂ
カレッヂ


質問者 よっしー  投稿日 5/22(火) 22:42:41
またまたお世話になります(^-^;
実はWebRingを作ろうと思いまして試行錯誤してるのですが
またもやつまずいてしまいました。お力添えお願いします。

$in{'no'}には参加番号の正数が入ってきます
ログファイルにある$numberがそれにあたります
($namberは数列ですが行削除されることもあるので連続数ではありません)

意図は、$in{'no'}と$numberがマッチした
次の行もしくは前の行へ飛びたいのですが
$in{'no'}にログの最終行/最行頭にある番号が入ってきたときに
エラーを起こします。輪になっていません(^-^;
ログの最終行番号が入ってきたときは最行頭の$urlに、
最行頭号が入ってきたときは最終行の$url飛びたいのです
どうかお知恵をお貸し下さい

#----------------#
#  次サイト処理  #
#----------------#
sub next {
        if ($in{'no'} eq "") { &error("番号情報がありません"); }

        open(IN,"$logfile") || &error("Log Open Error");
        @all = <IN>;
        close(IN);

        $i=0;
        foreach $all (@all) {
                ($number,$nin,$name,$email,$hpti,$url,$comment,$pass,$date,$host) = split(/<>/,$all);
                if($in{'no'} eq $number){
                $i=$i+1;
                        if($all[$i] ne ""){
                                ($nu,$ni,$na,$em,$hp,$ur,$co,$pa,$da,$ho) = split(/<>/,$all[$i]);
                                print "Location: $ur\n\n";
                                exit;
                        }
                }
        $i++;
        }
        exit;
}

#----------------#
#  前サイト処理  #
#----------------#
sub prev {
        if ($in{'no'} eq "") { &error("番号情報がありません"); }

        open(IN,"$logfile") || &error("Log Open Error");
        @all = <IN>;
        close(IN);

        $i=0;
        foreach $all (@all) {
                ($number,$nin,$name,$email,$hpti,$url,$comment,$pass,$date,$host) = split(/<>/,$all);
                if($in{'no'} eq $number){
                $i=$i-1;
                        if($all[$i] ne ""){
                                ($nu,$ni,$na,$em,$hp,$ur,$co,$pa,$da,$ho) = split(/<>/,$all[$i]);
                                print "Location: $ur\n\n";
                                exit;
                        }
                }
        $i++;
        }
        exit;
}
回答者 のりくん@謎謎謎  [削除]  投稿日 5/23(水) 07:30:03
これでどうでしょう??


#----------------#
#  次サイト処理  #
#----------------#
sub next {
         if ($in{'no'} eq "") { &error("番号情報がありません"); }

         open(IN,"$logfile") || &error("Log Open Error");
         @all = <IN>;
         close(IN);

         $al = @all;

         $i=0;
         foreach $all (@all) {
                 ($number,$nin,$name,$email,$hpti,$url,$comment,$pass,$date,$host) = split(/<>/,$all);
                 if($in{'no'} eq $number){
                 $i=$i+1;
                         if($i > $al){ $i='0'; }
                         if($all[$i] ne ""){
                                 ($nu,$ni,$na,$em,$hp,$ur,$co,$pa,$da,$ho) = split(/<>/,$all[$i]);
                                 print "Location: $ur\n\n";
                                 exit;
                         }
                 }
         $i++;
         }
         exit;
}

#----------------#
#  前サイト処理  #
#----------------#
sub prev {
         if ($in{'no'} eq "") { &error("番号情報がありません"); }

         open(IN,"$logfile") || &error("Log Open Error");
         @all = <IN>;
         close(IN);

         $al = @all;

         $i=0;
         foreach $all (@all) {
                 ($number,$nin,$name,$email,$hpti,$url,$comment,$pass,$date,$host) = split(/<>/,$all);
                 if($in{'no'} eq $number){
                 $i=$i-1;
                         if ($i < 0) { $i = $al -1; }
                         if($all[$i] ne ""){
                                 ($nu,$ni,$na,$em,$hp,$ur,$co,$pa,$da,$ho) = split(/<>/,$all[$i]);
                                 print "Location: $ur\n\n";
                                 exit;
                         }
                 }
         $i++;
         }
         exit;
}
質問者 よっしー  [削除]  投稿日 5/23(水) 08:38:08
のりくんさんご回答ありがとうございました
sub prevの方はお陰様で上手く行ったのですが
sub nextの方は最終行の数値が入った時
エラー起こしてしまいました。

説明しておりませんでしたが・・・
もしやログの書込順が関係しますか?
始行から若番で↓の様になってます。
1<>nin<>name<>email<>.....
2<>nin<>name<>email<>.....
4<>nin<>name<>email<>.....
8<>nin<>name<>email<>.....
9<>nin<>name<>email<>.....
11<>nin<>name<>email<>.....
20<>nin<>name<>email<>.....

また自分でも試行錯誤してみますが
なにかアドバイス頂けたらよろしく願います。
回答者 のりくん@謎謎謎  [削除]  投稿日 5/23(水) 19:12:43
よくよく確認したところ、多分下記の変更で
大丈夫かと・・・。

if($i > $al){ $i='0'; }

if($i > $al - 1){ $i='0'; }
にしてみてください。

質問者 よっしー  [削除]  投稿日 5/23(水) 22:21:48
のりくんさん上手く行きましたありがとうございました。
なにぶん最近CGI組んでみようと挑戦し出したところなので
行き詰まってばかりですがスキルアップして行きたいと思います
またお世話になることもあろうかと思いますが宜しく願います。

このページは終了したので返信(回答)は書きこめません

Web裏技