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";
}
Posted by yujiro このページの先頭に戻る
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて
トラックバックURL
コメントする
greeting