やることは2つ。
- ハッシュの配列化(配列のハッシュじゃないよ。)
- ハッシュのある要素に従ったソート
ハッシュの配列化
forやforeachで巡回しながらpushしていく形式がよく使うんじゃないかな。
my @list_map = (); foreach my $i (1..5){ my $hash = { "name" => "jonki" . $i, "score" => int(rand 100) }; push(@list_map, $hash); }
ハッシュのある要素に従ったソート
たとえば上の例だとscore順にソートして使いたい、ということがよくあると思う。(きっと)
自前で作ってもいいんだけど、Perlには便利なsort関数があるみたい。使ってみるとこんな感じ。$aと$bの順番を変えると逆順になる。結構分かりやすい。
@score_sort_list_map = sort {$a->{"score"} <=> $b->{"score"}} @list_map;
他のsortの例を知りたかったらここで。
- Site-cooler 配列をソート( 並び替え )する
サンプルソース
名前とスコアのハッシュの配列、でサンプルプログラム。学生の名前とその人のテストの点数みたいなイメージ。これを点数が低い順にソートしています。
use strict; use warnings; use Data::Dumper; my @list_map = (); foreach my $i (1..5){ my $ip_hash = { "name" => "jonki" . $i, "score" => int(rand 100) }; push(@list_map, $ip_hash); } print "* * * ソート前 * * *\n"; print Dumper(@list_map); my @score_sort_list_map = (); @score_sort_list_map = sort {$a->{"score"} <=> $b->{"score"}} @list_map; print "* * * ソート後 * * *\n"; print Dumper(@score_sort_list_map);
実行結果
以下実行例。scoreが低い順にソートされていて、nameの方もscoreと同じハッシュなので対応付けられています。
$ perl test.pl * * * ソート前 * * * $VAR1 = { 'name' => 'jonki1', 'score' => 0 }; $VAR2 = { 'name' => 'jonki2', 'score' => 91 }; $VAR3 = { 'name' => 'jonki3', 'score' => 35 }; $VAR4 = { 'name' => 'jonki4', 'score' => 50 }; $VAR5 = { 'name' => 'jonki5', 'score' => 28 }; * * * ソート後 * * * $VAR1 = { 'name' => 'jonki1', 'score' => 0 }; $VAR2 = { 'name' => 'jonki5', 'score' => 28 }; $VAR3 = { 'name' => 'jonki3', 'score' => 35 }; $VAR4 = { 'name' => 'jonki4', 'score' => 50 }; $VAR5 = { 'name' => 'jonki2', 'score' => 91 };