人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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;
}

●質問者: takeru-c
●カテゴリ:コンピュータ インターネット
✍キーワード:Categories DESIGNS EXIT HTML name
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● b-wind
●35ポイント

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

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


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

◎質問者からの返答

おー、そうでした。

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

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

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

##ソート処理

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

の部分だけなのです。


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

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


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

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


2 ● b-wind
●35ポイント ベストアンサー

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

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

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

◎質問者からの返答

ありがとうございます。

いろいろ試してみます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ