CGIでアクセスログの前に連番をつけるには?

[上に] [前に] [次に]
まさや [E-Mail] 1999/10/20(水) 17:29:16
CGIでアクセスログを表示させる時に、”1:ログ””2:ログ”
というふうに前に連番を振っていきたいと思い

open(LOG,"a_log.dat") || die "Can't Open User Access Log: $!\n";
hile($_ = <LOG>){
@@lines=<LOG>;
@for($i = 1; $i <= @lines; $i++){
@print "$i:$_\n";
@}
@}
lose(LOG);

と書いたところ、なぜか件数が1件足りなくなりました。
ためしにwhile文とfor文を別のCGIにしてみたら、そちらは
ちゃんと動いています。
まだ勉強し始めたばかりなので、どこがおかしいのかまったく
わかりません。すみませんが一度見ていただけないでしょうか?
なんだかものすごく見当違いなミスをしていそうなんですが(--;

マニュアルの関係でperlはver.4です。
ファイルは以下のアドレスにあります。
 while文のみ→http://www2u.biglobe.ne.jp/~kotonoha/cgi-bin/1.cgi 
 for文のみ→http://www2u.biglobe.ne.jp/~kotonoha/cgi-bin/2.cgi
 合わせたもの→http://www2u.biglobe.ne.jp/~kotonoha/cgi-bin/3.cgi
 ログ→http://www2u.biglobe.ne.jp/~kotonoha/cgi-bin/a_log.cgi
 cgiの記述→http://www2u.biglobe.ne.jp/~kotonoha/cgi-bin/cgi.txt

よろしくお願いします。

まさや [E-Mail] 1999/10/20(水) 17:32:07
すみません。一番かんじんなところがバケてしまいました。

open(LOG,"a_log.dat") || die "Can't Open User Access Log: $!\n";
while($_ = <LOG>){
 @lines=<LOG>;
 for($i = 1; $i <= @lines; $i++){
 print "$i:$_\n";
 }
 }
close(LOG);

です。
よろしくお願いします。

B-Cus 1999/10/20(水) 17:45:53
よいね〜。具体的だし、ソースもあげてるし、実行例も見られるし、
perl のバージョンも書いてあるし、素晴らしい質問の仕方だね〜。

実際の書き方としては、
 $count = 1;
 while ($_=<LOG>){
  print "$count: $_";
  $count++;
 }
あるいは
 $count = 1;
 @lines = <LOG>;
 foreach $_ ( @lines ){
  print "$count: $_";
  $count++;
 }
あるいは
 @lines = <LOG>;
 for ( $count=1 ; $count<=@lines ; $count++ ){
  print "$count: $lines[$count]";
 }
などすればいいでしょう。どれを取るかはお好みで。
特にこだわりがないなら、1番目の書き方がお勧め。

なぜうまく動かないかというと、
 while($_ = <LOG>){
で最初の1行を $_ に代入。
  @lines=<LOG>;
で、残りの行全部を @lines に代入。だからwhile で取った先頭の1行が少なくなる。
  print "$i:$_\n";
ここでは、whileで代入した先頭行が $_ に入っているので、常に
同じ値になる。だから
 http://www2u.biglobe.ne.jp/~kotonoha/cgi-bin/3.cgi
の内容は全部の行が同じでしょ?

まさや [E-Mail] 1999/10/20(水) 18:25:45
[[解決]]
オススメしていただいた1番目の方法で、すっきりキレイに
動きました!
すごく丁寧な答えをありがとうございました。
perlはいろんな書き方があるとは聞いていたのですが、これ
だけでも3つも書き方があるんですね。あげていただいた他
の書き方もじっくり勉強させていただきます。

http://www2u.biglobe.ne.jp/~kotonoha/cgi-bin/3.cgi
>の内容は全部の行が同じでしょ?
はっ、ちっとも気づいてませんでした(--;

[上に] [前に] [次に]