perlのハッシュのソートについて質問です。

下記コードの「##ソート処理」部分で、$resultの'themes'の中身を、'sort'の値で並び替えたい場合は、どのような処理にしたらよいでしょうか。
よろしくお願い致します。

#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;

my $result = xxx();
print "Content-type: text/html\n\n";

print Dumper($result); #並び替え前

#▼この部分で'themes'の中身を、'sort'の値で並び替えたい

##ソート処理

#▲この部分で'themes'の中身を、'sort'の値で並び替えたい

print Dumper($result); #並び替え後

exit;

sub xxx {
my $themes = {
'temple-d' => {
'sort' => 'Template D',
'name' => 'xxx',
'title' => 'test'
},
'temple-a' => {
'sort' => 'Template A',
'name' => 'xxx',
'title' => 'test'
},
'temple-b' => {
'sort' => 'Template B',
'name' => 'xxx',
'title' => 'test'
}
};

my $categories = {
'designs'
};

my $data = {
categories => [ keys %$categories ],
themes => [ values %$themes ]
};

$data;
}

回答の条件
  • 1人3回まで
  • 登録:2009/03/28 09:49:27
  • 終了:2009/04/01 10:10:58

ベストアンサー

id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402009/03/28 10:28:32

ポイント35pt

データ形式を変換していいなら、たいした事ではないです。

my @sorted = map { $themes->{$_} } sort { $themes->{$a}->{sort} <=> $themes->{$b}->{sort} } keys %{$themes};
print Dumper \@sorted;

とでもすれば、順序を持った配列に格納されますから、あとは適当にアレンジしてみてください。

id:takeru-c

ありがとうございます。

いろいろ試してみます。

2009/03/28 22:07:15

その他の回答(1件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402009/03/28 10:03:38

ポイント35pt

Hash のキーを Hash のまま並び替えたい( PHP の array や Java の SortedHash のように )という意味であれば言語仕様上無理。

Perl の Hash キーの順番は常に不定。


別のデータ構造を定義したほうが良いんじゃない?

id:takeru-c

おー、そうでした。

やりたいことは、'sort'の順番に $themesの中身を取り出して出力したい、ということなのですが、可能でしょうか。

ちなみに、上記コードは実際のコードからかなり簡略化していますが、触れるところは、とある理由から、

#▼この部分で'themes'の中身を、'sort'の値で並び替えたい

##ソート処理

#▲この部分で'themes'の中身を、'sort'の値で並び替えたい

の部分だけなのです。


※print Dumper($result); #並び替え後

は無視して構わないです。並び替えて表示さえできれば。


※今気がつきましたが、'name'と'title'の値がすべて一緒になってました・・・。

その為、今回のコードでは、'sort'の値のみ表示で構わないです。

2009/03/28 10:29:23
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402009/03/28 10:28:32ここでベストアンサー

ポイント35pt

データ形式を変換していいなら、たいした事ではないです。

my @sorted = map { $themes->{$_} } sort { $themes->{$a}->{sort} <=> $themes->{$b}->{sort} } keys %{$themes};
print Dumper \@sorted;

とでもすれば、順序を持った配列に格納されますから、あとは適当にアレンジしてみてください。

id:takeru-c

ありがとうございます。

いろいろ試してみます。

2009/03/28 22:07:15

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません