Perlでハッシュをソートする方法のまとめ

Perlでハッシュをソートする方法のまとめ

Posted at December 18,2013 1:33 AM
Tag:[Perl]

Perlでハッシュをソートする方法をまとめました。

このエントリーはPerlビギナーの方向けの内容です。

1.問題点

次のようなハッシュを作り、出力してみました。

my %foo;
$foo{Mon} = 10;
$foo{Tue} = 200;
$foo{Wed} = 30;
$foo{Tur} = 1000;
$foo{Fri} = 20;
$foo{Sat} = 50;
$foo{Sun} = 1;
 
for my $key (keys %foo) {
    print "$key:$foo{$key}\n";
}

実行結果(例)

Mon:10
Tue:200
Fri:20
Tur:1000
Wed:30
Sun:1
Sat:50

このハッシュについて、キーと値のそれぞれでソートして出力したいのですが、具体的な方法が分かりません。

2.ハッシュのキーでソートする

ハッシュのキーでソートするには、for文のハッシュ名の左側に「sort keys」を追加します。

for my $key (sort keys %foo) {
    print "$key:$foo{$key}\n";
}

実行結果

Fri:20
Mon:10
Sat:50
Sun:1
Tue:200
Tur:1000
Wed:30

3.ハッシュのキーで逆順にソートする

ハッシュのキーで逆順にソートするには、2項の記述に「reverse」を追加します。

for my $key (reverse sort keys %foo) {
    print "$key:$foo{$key}\n";
}

実行結果

Wed:30
Tur:1000
Tue:200
Sun:1
Sat:50
Mon:10
Fri:20

4.ハッシュの値でソートする

ハッシュの値でソートするには、for文のハッシュ名の左側に「sort values」を追加します。

for my $key (sort values %foo) {
    print "$value\n";
}

実行結果

1
10
1000
20
200
30
50

5.ハッシュの値で逆順にソートする

ハッシュの値で逆順にソートするには、2項の記述に「reverse」を追加します。

for my $value (reverse sort values %foo) {
    print "$value\n";
}

実行結果

50
30
200
20
1000
10
1

6.ハッシュを数値でソートする

4項と5項は数字が期待通りに並んでいません。これはデフォルトのソートが文字列として扱われるためです。

数値としてソートするには、数値でのソート条件「{$a <=> $b}」を記述します。

for my $value (sort {$a <=> $b} values %foo) {
    print "$value\n";
}

実行結果

1
10
20
30
50
200
1000

逆順でソートする場合は、5項と同様「reverse sort~」とするか、$aと$bの位置を入れ替えます。

また、キーを数値としてソートする場合も同様です(今回のサンプルではあてはまりません)。

for my $keys (sort {$a <=> $b} keys %foo) {
    print "$key:$foo{$key}\n";
}

6.ハッシュを値でソートしてキーも出力する

5項に示した値のソートでは、キーが表示されません。

値でソートしてキーも出力したい場合は、キーでソートし、ソート条件の中で値をソートする記述を追加します。

for my $key (sort {$foo{$a} <=> $foo{$b}} keys %foo) {
    print "$key:$foo{$key}\n";
}

実行結果

Sun:1
Mon:10
Fri:20
Wed:30
Sat:50
Tue:200
Tur:1000

7.複合条件でソートする

複合条件でソートするには、それぞれの条件を「||」でつなぎます。はじめの条件で比較できなかった場合は2つめの条件でソートします。

for my $key (sort {$foo{$a} <=> $foo{$b} || $a cmp $b} keys %foo) {
    print "$key:$foo{$key}\n";
}
関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)