アプリ版:「スタンプのみでお礼する」機能のリリースについて

ファイルの容量が大きく。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")
}
}
-------------------------------------------------------------------------------

A 回答 (6件)

出力していって書き込みたいって意味でしたか・・・。

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

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

    • good
    • 0

や~, そこまでは言ってませんよ~>#3.



そもそも「何を考えてこのプログラムを作ったのか」がさっぱりわからんので....

例えば elsif($data eq "C") のところで $count を 0 にする理由が見当たらん. 「flag1 をたてる」が $flag = 1; で「flag2 をたてる」が $flag = 2; なのになぜ「flag3 をたてる」が $flag = 0; になるのかとか, とにかく上の文章からどうしてこんなプログラムになるのかわからんのですよ....
    • good
    • 0

次のようにするとどうでしょうか。


No.1さんが言ってるのは 2 のことですよ。

1. eq 'B'節の $count == $data; は無駄なので削除
2. eq 'B'節の print を eq 'C'節の $count = 0; の行より前に移動
3. eq 'C'節の $b は無駄なので削除して、$c = $time - $a; とする
    • good
    • 0

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

    • good
    • 0

最後に出力すれば?

この回答への補足

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

補足日時:2012/06/18 18:37
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!