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

2 thoughts on “[Perl]ハッシュのソート方法一覧

  1. ハッシュのキーで数値昇順ソート, ハッシュのキーで数値降順ソート
    の部分が値でソートしています。

    値でソートする場合、キーが不要であるなら、’values’を使ってソートすることも
    できます。あと降順にソートする場合、昇順にソートしたものに reverseを適用する
    方法もあります。この場合、ブロックの部分を書かなくて済むこともあるので、
    場合により見やすくなると思います。(書籍「Perlベストプラクティス」では reverse
    を使う方法を推奨しています。)

    あと UTF-8に encodeするのであれば、
    binmode STDOUT, “:utf8”;
    の一文を use utf8の下あたりに追加しておけば, encodeを記述する必要がなくなります。

    Reply
    • 間違っていた箇所を修正しました。
      ご指摘いただきありがとうございますm(_ _)m

      ‘values’と’reverse’は初めて知りました。
      なるほど…、今度使ってみます。

      binmodeは存在自体を忘れてました…。
      確かにencode入れる必要なくなりますね。
      ちゃんと記憶しとかないと…。

      Reply

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>