• 締切済み

perl初心者です。宜しくお願い致します。

ファイルの容量が大きく。perlを使用してデータの集計をしています。 "A"がきたらflag1をたてなさい。 "B"がきたらflag2をたてなさい。 "C"がきたらflag3をたてなさい。 これでAとBとCを抜き取ること&AからCまでの時間を取得したのですが、 Bの数のmaxの値だけを抜き取りたいのですが、Bがきたときの数をすべて 出力してしまいます。下記の文だと、Bが4回きたら、1,2,3,4と出力してしまいます。 それで4だけを出力したいのですがどのように書き換えたらようか教えて頂けますでしょうか。 '----------------------------------------------------------------------------- open (IN,"< $ARGV[0].txt") or die; open (OUT,"> $ARGV[0]_out.txt") or die; $flag =0; my $a, $b, $c; $count = 0; ####################################################### while($line =<IN>){ ($time,$data) = split(/\s+/,$line); if($data eq "A") { $flag=1; $a = $time; #print OUT $line; #print OUT "\n"; } elsif($data eq "B"){ $flag=2; $count++; $count == $data; print OUT ("$count\n") } #print OUT ("$count\n"); elsif($data eq "C"){ $flag=0; $count=0; $b = $time; $c = $b - $a; print OUT ("time $c\n") } } -------------------------------------------------------------------------------

みんなの回答

  • yamada11
  • ベストアンサー率18% (2/11)
回答No.6

出力していって書き込みたいって意味でしたか・・・。よく理解して無かったです。すいません。 もしBをみつけた最大の時に書き込みたいなら、まずBの個数をいったん調べる必要があると思います。 私ならそうするって程度意見ですが。

  • yamada11
  • ベストアンサー率18% (2/11)
回答No.5

自分だったら、Bの$countを$count_b(グローバルに宣言して)とかにして、while文抜けた後に出力するかな。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

や~, そこまでは言ってませんよ~>#3. そもそも「何を考えてこのプログラムを作ったのか」がさっぱりわからんので.... 例えば elsif($data eq "C") のところで $count を 0 にする理由が見当たらん. 「flag1 をたてる」が $flag = 1; で「flag2 をたてる」が $flag = 2; なのになぜ「flag3 をたてる」が $flag = 0; になるのかとか, とにかく上の文章からどうしてこんなプログラムになるのかわからんのですよ....

回答No.3

次のようにするとどうでしょうか。 No.1さんが言ってるのは 2 のことですよ。 1. eq 'B'節の $count == $data; は無駄なので削除 2. eq 'B'節の print を eq 'C'節の $count = 0; の行より前に移動 3. eq 'C'節の $b は無駄なので削除して、$c = $time - $a; とする

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

どう「だめだった」のかを明らかにするつもりはないんでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

最後に出力すれば?

kousuke_1230
質問者

補足

最後に出力すればいいと思い、print OUT ("$count\n"); をうしろにもってきてもだめでした。

関連するQ&A