• ベストアンサー

Perlで数字が出てくる回数をカウントするには?

ある、1から5までのスロット(またはセル)に1から200までの数字がランダムに出てくる(登録される)とします。その出てきた、数字が同一のものであれば数を数えたいのですが、どなたか教えていただけないでしょうか? たとえば 1 に 123 2 に 45 3 に 3 4 に 62 5 に 45 とあったとします。  そうすれば、2と5のスロット(またはセル)に45が 2個あるので 表示を45が2 123が1、3が1、62が1のように表示させたいのです。  123, 1 45, 2 3, 1 62, 1 どうもいいサイトもなくうまくできません。 どうすればできますでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

案a)sortして、値の切り替わりを見ながら数えてゆく(unix系でよくやるsort|uniq -cの手法)。 案b)連想配列を利用して、それぞれの個数を数える。 ――とか。 Perl FAQの、行の出現頻度を数えるサンプルが参考になりますよ。 http://search.cpan.org/~flora/perl-5.14.2/pod/perlfaq6.pod#How_can_I_print_out_a_word-frequency_or_line-frequency_summary?

参考URL:
http://ideone.com/akMlh
PerlLearner1
質問者

お礼

どうもありがとうございました。 解決できました。

その他の回答 (1)

回答No.1

普通、こういうことをする場合は連想配列を使って、数値が見つかるたびに連想配列のその要素を+1ですね。 セル・スロットというのが何を言いたいのかわかりませんが、Excelなどからデータを呼んでそういうことをする場合は、そういうライブラリーを使って各セルを読み出します。 その後に行う操作は元のフォーマットがExcelであってもなんであっても同じです。 Excelを読むライブラリーは CPANで Excelと打つなどして探してみてください。http://search.cpan.org/ それで、見つかったライブラリーの名前で検索したら誰かが使い方を解説しているかもしれません。 ここでは、標準入力からデータが来たとしてやって、数を数えた後に標準出力に出力します。 my %numbers; while (<STDIN>) { $numbers{$_} = $numbers{$_} + 1; } while (($number, $counter) = each %numbers){ print "$number,$counter"; }

PerlLearner1
質問者

お礼

どうもありがとうございました。 解決できました。

関連するQ&A