The jonki

呼ばれて飛び出てじょじょじょじょーんき

【Perl】 ハッシュの配列の要素でソート

やることは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の例を知りたかったらここで。

サンプルソース

名前とスコアのハッシュの配列、でサンプルプログラム。学生の名前とその人のテストの点数みたいなイメージ。これを点数が低い順にソートしています。

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