• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ハッシュを使った集計結果の出力について)

ハッシュを使った集計結果の出力について

このQ&Aのポイント
  • ファイル名の一部をキーとして、○△×の回数を値にしたハッシュで集計しようとしましたが、正しく動作しなかったため、ハッシュが理解しきれていない可能性があります。
  • 質問の要点は、「testフォルダ内のファイルにある○△×の数を集計したいが、正しく集計できない」ということです。ハッシュを利用して集計を行っていましたが、うまくいかなかったようです。
  • ファイル名の一部をキーとして、○△×の回数を値にしたハッシュで集計しようとしましたが、うまくいかなかったため、ハッシュについてもう少し理解が必要です。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> 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;

chatnoir25
質問者

お礼

ご回答ありがとうございます! pushでは加算できないんですね。確かにそうですよね。。 readdirも適当に使っていたのでとても勉強になりました。 基本的なところから勉強し直さなくては。 あ、ディレクトリは引数で指定するつもりでしたので、それが$dirになります。 (perlの内容全てを書いていませんでした) 説明も丁寧で大変役に立ちました。本当にありがとうございました。 できるようになりました!

その他の回答 (1)

  • YkazubonY
  • ベストアンサー率30% (26/86)
回答No.2

ハッシュと言うのは、%で宣言する変数です。 ハッシュを使うコーディングじゃ無いみたいですけど。 何をハッシュのキーにしたいのでしょうか? 意図を説明して下さい。

chatnoir25
質問者

お礼

ご回答ありがとうございます。 キーは$name、値は$maru,$san,$batuの回数です。

関連するQ&A