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
>の内容は全部の行が同じでしょ?
はっ、ちっとも気づいてませんでした(--;
[上に]
[前に]
[次に]