Perlでのハッシュソート方法をメモメモ。
文字コードはUTF-8です。
use strict;
use warnings;
use utf8;
use Encode qw/encode/;
my %hash = (
c => 'bb',
d => 'aa',
a => 'dd',
b => 'cc',
);
# ハッシュのキーで文字列昇順ソート
print encode('UTF-8', "ハッシュのキーで文字列昇順ソート\n");
foreach my $key (sort keys %hash) {
print "$key, $hash{$key}\n";
}
# ハッシュのキーで文字列降順ソート
print encode('UTF-8', "ハッシュのキーで文字列降順ソート\n");
foreach my $key (sort {$b cmp $a} keys %hash) {
print "$key, $hash{$key}\n";
}
# ハッシュの値で文字列昇順ソート
print encode('UTF-8', "ハッシュの値で文字列昇順ソート\n");
foreach my $key (sort { $hash{$a} cmp $hash{$b} } keys %hash) {
print "$key, $hash{$key}\n";
}
# ハッシュの値で文字列降順ソート
print encode('UTF-8', "ハッシュの値で文字列降順ソート\n");
foreach my $key (sort { $hash{$b} cmp $hash{$a} } keys %hash) {
print "$key, $hash{$key}\n";
}
%hash = (
3 => 22,
4 => 11,
1 => 44,
2 => 33,
);
# ハッシュのキーで数値昇順ソート
print encode('UTF-8', "ハッシュのキーで数値昇順ソート\n");
foreach my $key (sort {$a $b} keys %hash) {
print "$key, $hash{$key}\n";
}
# ハッシュのキーで数値降順ソート
print encode('UTF-8', "ハッシュのキーで数値降順ソート\n");
foreach my $key (sort {$b $a} keys %hash) {
print "$key, $hash{$key}\n";
}
# ハッシュの値で数値昇順ソート
print encode('UTF-8', "ハッシュの値で数値昇順ソート\n");
foreach my $key (sort { $hash{$a} $hash{$b} } keys %hash){
print "$key, $hash{$key}\n";
}
# ハッシュの値で数値降順ソート
print encode('UTF-8', "ハッシュの値で数値降順ソート\n");
foreach my $key (sort { $hash{$b} $hash{$a} } keys %hash){
print "$key, $hash{$key}\n";
}
たぶんこれで合ってるはず…。
※2011/08/02追記
ハッシュのキーで数値昇順、降順ソートが思いっきり間違っていたので修正しました。
ご指摘いただきありがとうございますm(_ _)m
ハッシュのキーで数値昇順ソート, ハッシュのキーで数値降順ソート
の部分が値でソートしています。
値でソートする場合、キーが不要であるなら、’values’を使ってソートすることも
できます。あと降順にソートする場合、昇順にソートしたものに reverseを適用する
方法もあります。この場合、ブロックの部分を書かなくて済むこともあるので、
場合により見やすくなると思います。(書籍「Perlベストプラクティス」では reverse
を使う方法を推奨しています。)
あと UTF-8に encodeするのであれば、
binmode STDOUT, “:utf8”;
の一文を use utf8の下あたりに追加しておけば, encodeを記述する必要がなくなります。
間違っていた箇所を修正しました。
ご指摘いただきありがとうございますm(_ _)m
‘values’と’reverse’は初めて知りました。
なるほど…、今度使ってみます。
binmodeは存在自体を忘れてました…。
確かにencode入れる必要なくなりますね。
ちゃんと記憶しとかないと…。