- ベストアンサー
ハッシュを使った集計結果の出力について
- ファイル名の一部をキーとして、○△×の回数を値にしたハッシュで集計しようとしましたが、正しく動作しなかったため、ハッシュが理解しきれていない可能性があります。
- 質問の要点は、「testフォルダ内のファイルにある○△×の数を集計したいが、正しく集計できない」ということです。ハッシュを利用して集計を行っていましたが、うまくいかなかったようです。
- ファイル名の一部をキーとして、○△×の回数を値にしたハッシュで集計しようとしましたが、うまくいかなかったため、ハッシュについてもう少し理解が必要です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> aaa,13,59,0 → aaa_1の内容 これは予定通りのはず。 > aaa,13,59,0,13,59,37 → すでに、この前に $test{'aaa'}として aaa_1の $maru,$san,$batu のリストが存在している。 それに aaa_2の$maru,$san,$batuを push(@{$test{$name}} , $maru,$san,$batu);として「追加」しているのだから $test{'aaa'}=[ aaa_1の$maru, aaa_1の$san, aaa_1の$batu, aaa_2の$maru, aaa_2の$san, aaa_2の$batu ]; となります。 これをjoinで継げて表示すれば、当然、その実行結果の通りになる。 pushはリストに「新しい要素を追加する」のであって、「既存のリストの要素に加算する」ものではありません。 期待するものにするならば、 $test{$name}[0] += $maru; $test{$name}[1] += $san; $test{$name}[2] += $batu; と、それまでの値に新しい値を「加算」しなければ。 >,0,0,0 → $file =~/(.*)_(.*)/; がマッチしないファイル名のため、$nameが空文字列''になっている readdirには . (カレントディレクトリ)や .. (一つ上のディレクトリ)も含まれる。 if ( $file !~/(.*)_(.*)/ ) { next ; } などとして、マッチしないファイルは処理を飛す必要があります。 >,0,0,0,0,0,0 上のaaa_2のケースと同じ。おそさく ,0,0,0ではカレントディレクトリ, ここでは親ディレクトリを処理している。 あとは ・$dirはどこから出てきた? ・FIN1はどこから? ・OUTはどこから? ・close IN の位置がおかしいのでは? while ( $line = <FIN1> )のループの終了直後だと思うのですが。(FIN1がINだとして) ・aaa_1のときとaaa_2の時の2回 aaaが表示されるが、それでいいの? おそらく、こんなのを求めているのでは? $dir= "." ; #検索ディレクトリ opendir(DIR, $dir) ; while ($file = readdir(DIR)){ if ( ! -f $file ) { next;} #ファイルで無い場合は無視 if ( $file !~/(.*)_(.*)/ ) {next;} #非該当ファイルは無視 $name = $1; if ( ! defined( $test{$name} ) { # 新しい名前だったら初期化する $test{$name}=[0,0,0] ; } open(IN, "$dir/$file"); while ( $line = <IN> ){ # chomp( $line ); #chomp必要ですか? if($line =~/○/){ # $maru++; と別変数に入れて後で足すくらいなら、 $test{$name}[0] ++ ; #と最初から足せばよい }elsif($line =~/△/){ $test{$name}[1] ++ ; }elsif($line =~/×/){ $test{$name}[2] ++ ; } } close IN ; #whileが終れば、ファイルは入力済み } #全ファイル終了 closedir DIR ; open(OUT,"output.txt"); #出力ファイル foreach $name (keys %test) { print OUT join (",", $name, @{$test{$name}}) . "\n"; } close OUT;
その他の回答 (1)
- YkazubonY
- ベストアンサー率30% (26/86)
ハッシュと言うのは、%で宣言する変数です。 ハッシュを使うコーディングじゃ無いみたいですけど。 何をハッシュのキーにしたいのでしょうか? 意図を説明して下さい。
お礼
ご回答ありがとうございます。 キーは$name、値は$maru,$san,$batuの回数です。
お礼
ご回答ありがとうございます! pushでは加算できないんですね。確かにそうですよね。。 readdirも適当に使っていたのでとても勉強になりました。 基本的なところから勉強し直さなくては。 あ、ディレクトリは引数で指定するつもりでしたので、それが$dirになります。 (perlの内容全てを書いていませんでした) 説明も丁寧で大変役に立ちました。本当にありがとうございました。 できるようになりました!