- 締切済み
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") } } -------------------------------------------------------------------------------
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- yamada11
- ベストアンサー率18% (2/11)
出力していって書き込みたいって意味でしたか・・・。よく理解して無かったです。すいません。 もしBをみつけた最大の時に書き込みたいなら、まずBの個数をいったん調べる必要があると思います。 私ならそうするって程度意見ですが。
- yamada11
- ベストアンサー率18% (2/11)
自分だったら、Bの$countを$count_b(グローバルに宣言して)とかにして、while文抜けた後に出力するかな。
- Tacosan
- ベストアンサー率23% (3656/15482)
や~, そこまでは言ってませんよ~>#3. そもそも「何を考えてこのプログラムを作ったのか」がさっぱりわからんので.... 例えば elsif($data eq "C") のところで $count を 0 にする理由が見当たらん. 「flag1 をたてる」が $flag = 1; で「flag2 をたてる」が $flag = 2; なのになぜ「flag3 をたてる」が $flag = 0; になるのかとか, とにかく上の文章からどうしてこんなプログラムになるのかわからんのですよ....
- MillenniuM
- ベストアンサー率58% (42/72)
次のようにするとどうでしょうか。 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)
どう「だめだった」のかを明らかにするつもりはないんでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
最後に出力すれば?
補足
最後に出力すればいいと思い、print OUT ("$count\n"); をうしろにもってきてもだめでした。