1. まとめトップ

perl連想配列のソート

perl連想配列のソート

更新日: 2015年01月25日

hcheckinさん

  • このまとめをはてなブックマークに追加
1 お気に入り 8007 view
お気に入り追加

perl 連想配列のソート
use strict;
use warnings;
use 5.10.1;

my %kawaiso = (
kazurari => { age => 16 },
ritsu => { age => 17 },
shirosaki => { age => 25 },
mayumi => { age => 27 },
sayaka => { age => 24 },
sumiko => { age => 34 },
);

foreach my $name (sort { $kawaiso{$a}{age} <=> $kawaiso{$b}{age} } keys %kawaiso ) {
say sprintf "%9s %d", $name, $kawaiso{$name}{age};
}
__END__
kazurari 16
ritsu 17
sayaka 24
shirosaki 25
mayumi 27
sumiko 34

表示の直前まで、年を含んだようにしておくべし

# 連想配列 あえて、panel順序、日の順序もバラバラにしてる
57 my %HoH = (
58 'panel_1' => { '20141203'=>'0' , '20141204'=>'0' , '20141205'=>'0' , '20141206'=>'0' , '20141207'=>'0' , '20141208'=>'0' },
59 'panel_8' => { '20141208'=>'0' , '20141207'=>'0' , '20141203'=>'0' , '20141204'=>'0' , '20141206'=>'0' , '20141205'=>'0' },
60 'panel_6' => { '20141208'=>'0' , '20141207'=>'0' , '20141203'=>'0' , '20141204'=>'0' , '20141206'=>'0' , '20141205'=>'0' },
61 'panel_3' => { '20141208'=>'0' , '20141207'=>'0' , '20141203'=>'0' , '20141204'=>'0' , '20141206'=>'0' , '20141205'=>'0' },
62 'panel_4' => { '20141205'=>'0' , '20141206'=>'0' , '20141205'=>'0' , '20141206'=>'0' , '20141203'=>'0' , '20141204'=>'0' },
63 );


78 # ソートされた全体を出力
79 foreach my $family ( sort keys %HoH ) {
80 print "$family: { ";
81 for my $role ( sort keys %{ $HoH{$family} } ) {
82 print "$role=$HoH{$family}{$role} ";
83 }
84 print "}\n";
85 }

出力 panelでもソートしてるし、中の日でもソートしてる
panel_1: { 20141203=0 20141204=0 20141205=0 20141206=0 20141207=0 20141208=0 }
panel_3: { 20141203=0 20141204=0 20141205=0 20141206=0 20141207=0 20141208=0 }
panel_4: { 20141203=0 20141204=0 20141205=0 20141206=0 }
panel_6: { 20141203=0 20141204=0 20141205=0 20141206=0 20141207=0 20141208=0 }
panel_8: { 20141203=0 20141204=0 20141205=0 20141206=0 20141207=0 20141208=0 }

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



4.ハッシュの値でソートする
ハッシュの値でソートするには、for文のハッシュ名の左側に「sort values」を追加します。
------------------------------
for my $key (sort values %foo) {
print "$value\n";
}
------------------------------
実行結果
1
10
1000
20
200
30
50

6.ハッシュを数値でソートする
4項と5項は数字が期待通りに並んでいません。これはデフォルトのソートが文字列として扱われるためです。
数値としてソートするには、数値でのソート条件「{$a <=> $b}」を記述します。
------------------------------
for my $value (sort {$a <=> $b} values %foo) {
print "$value\n";
}
------------------------------
実行結果
1
10
20
30
50
200
1000

1





hcheckinさん

このまとめに参加する