カレッヂ |
質問者 よっしー
投稿日 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裏技 |