• ベストアンサー

ログファイル表示で全部表示されたりされなかったり…

ログファイルをオープン、その中のユーザー名・パスワードと入力されたユーザー名・パスワードを比較して、どちらも一致した場合のみ表示するようなものを作成しました。 ただ単に表示を行うと一致するものすべて表示されるのですが、テーブルなどを使用して表示させると数が減って表示されるのです。 これはいったいなぜでしょうか? ---------- for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach if($FORM{'USER'} eq $FORMS{'USER'}){ if($FORM{'PASSWORD'} eq $FORMS{'PASSWORD'}){ print "$FORMS{'TITLE'}<BR>\n"; print "<BR>\n"; だと全件(19件入力中、一致は18件。18件すべて)表示 一番下を print "<TABLE>\n"; print "<TR><TD>$FORMS{'TITLE'}</TD></TR>\n"; print "</TABLE><BR>\n"; print "<BR>\n"; と変更すると13件しか表示されません。

質問者が選んだベストアンサー

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

perlとしては tableだろうと何だろうとふつうに print文を実行するだけでしょうから、どこかにバグが潜んでるんだと思います。2つのperlソースを良く見比べて、何処が違うのかを発見するしかないでしょう。 tableとして生成された htmlソース上にも13件分のデータしかないのですか? 念のためにお聞きしますが、for文のカッコ閉じ、if文のカッコ閉じはここに書いていないだけで、実際にはちゃんと閉じているのですよね?

w-inty
質問者

お礼

回答ありがとうございます。 for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach #print "<FONT COLOR=GREEN>$i<BR></FONT>\n"; if($FORM{'USER'} eq $FORMS{'USER'}){ if($FORM{'PASSWORD'} eq $FORMS{'PASSWORD'}){ print "<TABLE>\n"; print "<TR><TD>タイトル</TD><TD>$FORMS{'TITLE'}</TD></TR>\n"; print "</TABLE>\n"; print "<BR>\n"; }#if }#if } となってます。 今、ログファイルを増やしてみたら、その分表示される件数が変化しました。 ニュアンス的にですが、どうやら、表示される件数というか、HTMLの行数?みたいなので制限されてるような感じです。 そんな制限ってできるんでしょうか? (私は設定した覚えはないんですが。)

その他の回答 (4)

  • feininger
  • ベストアンサー率41% (74/180)
回答No.5

> 今まで扱ってきたログファイルよりはるかに短いものなのにどうしてだめなんでしょうか? ログファイルを作成する際、データにNullコードが混入していませんか? (無駄なpushをしていたりとか) また、表示する際にNullを送信してしまうと、そこから表示が切れてしまうこともありますよ。

w-inty
質問者

お礼

回答ありがとうございます。 pushは使ってないはずです。 ログファイルに原因があるかどうかをみるために、1行目から81行目まで同じものを入力しましたが、やはり80行目で切れてしまいます。。 同じデータなので、データにおかしいところがある、ということもないと思うんですが…。

w-inty
質問者

補足

さらに違う実験をしてみました。 1行のデータが長めのデータを利用して同じように全部同じログファイルにしたところ、80行行く前に「ページを表示できません」と出てしまいます。 何度やってもだめでした。 行数を減らしたら出てくるようになりましたが。 これはやはり読み込み時にデータの量が多くてエラーがおきてるんでしょうか?

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.4

これまで頂いたプログラムをそのまま組み合わせて、テストしてみました。 データは aaa=bbb&bbb=ccc&title=test1 aaa=bbb&bbb=ccc&title=test2 aaa=bbb&bbb=ccc&title=test3  : aaa=bbb&bbb=ccc&title=test30 と言う感じで作りました。 結果から言うと、ちゃんと表示されました。 テスト環境は W2k/Apache2.0/ActivePerl5.6 Linux2.2.14/Apache1.3.12/Perl5.0005 Linux2.??/Apache2.0/Perl5.?? の3種類で行いました。 ソースはsjisで次の通り。 --- #!/usr/local/bin/perl open FILE,"<aaa.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; $gyou = @log; print "Content-type: text/html\n\n"; print "<html><body>\n\n"; for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach print "<TABLE>\n"; print "<TR><TD>タイトル</TD><TD>$FORMS{'title'}</TD></TR>\n"; print "</TABLE>\n"; print "<BR>\n"; } print "\n</body></html>\n"; --- と言うわけで、Perlソースのロジックではない他に原因があるのだと思います。 データファイルに問題がないとすれば、ちょっと私にはお手上げです。 #すいません。

w-inty
質問者

お礼

回答ありがとうございます。 やはりPerlに間違いはないですか~うーん。 ログの方もいろいろみてるんですが、別にこれといって問題はなさそうなんですけどね。。 ありがとうございました。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.3

この for文/foreach文に関しては、やはり特に問題がなさそうな感じですね。 それ以前の行について $gyouへの代入と $log[n]にファイルの行を読み込んでいるところはどんな感じでしょうか?

w-inty
質問者

お礼

回答ありがとうございます。 open FILE,"<***.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; $gyou = @log; のようになってます。 普段使用しているような形なんですが…。

w-inty
質問者

補足

print "@log\n"; もためしたりしました。 どうやらログファイルの量が多くてパンク?してるみたいな形にみえるんですが。。 でも1つのデータは、 「名前」「パスワード」「タイトル」 くらいの短いものなんですけど。 今まで扱ってきたログファイルよりはるかに短いものなのにどうしてだめなんでしょうか?

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

うーーん、ソースを見る限りは特に問題がなさそうですねぇ。 あとは、データの問題とかぐらいしか考えられない感じです。 たとえば、データ内に <tr>や<table>、&など、htmlの予約語がそのまま格納されていて、ブラウザで表示されないとか....。 もう一度お聞きしますが、CGIによって生成された HTML内もデータが見あたらないのですか? #ブラウザが表示できないだけで、HTMLソースには出力されているかもしれないので。

w-inty
質問者

お礼

回答ありがとうございます。 タグは入っていません。 それとhtml内にもデータは入っていません。 テーブルタグが中途半端なところでなくなってます…。 ログを延々と増やしたところ、80行目以降が表示されなくなってしまいました。 80行目までは正常に表示されています。 (表示方法はテーブルなど使わないで、 $i $FORMS{'TITLE'} としています) このへんが原因かと思いますが、このような現象が起こる原因がまったくわかりません…。

w-inty
質問者

補足

print "$gyou\n"; でみてみると現在は87行と出ます。 行数はあってます。 for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach print "<FONT COLOR=PINK>$i $FORMS{'TITLE'}<BR></FONT>\n"; } のようにしてif文もなくしてみたんですが、やはり80行以降は表示されません。 $gyouで87とでるし、87行目までforが続くはずだと思うんですが…。

関連するQ&A

専門家に質問してみよう