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入れる必要なくなりますね。
ちゃんと記憶しとかないと…。