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

perlのハッシュのソートについての質問です。
次のような処理をしているのですが警告が出ます。

[1] idとvalueがセットになったハッシュを複数作成する

my %id_and_value = ('id' => 1 , 'name' => 'hoge' , 'value' => 481);

[2] %hashに入れる際にvalue+idをキーにする(後でvalueでソートしたいため)

$hash{$id_and_value{'value'} .'_' .$id_and_value{'id'} = \%id_and_value

[3] %hashをソートしながら出力する

foreach my $key ( sort { $a <=> $b } keys %hash ){
}

ちゃんとソートされるのですが、ここで次のようなエラーが出ます。

index.cgid: Argument "481_1" isn't numeric in sort at line 100
index.cgid: Argument "154_3" isn't numeric in sort at line 100

valueでidをソートしたいと言うことなのですが、エラーが出ないようにするにはどうすればいいでしょうか?



解説をいただけると大変助かります、よろしくお願いします。

●質問者: southgate_01
●カテゴリ:インターネット ウェブ制作
✍キーワード:AT e+ hoge INDEX Key
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● b-wind
●70ポイント ベストアンサー

Perl の演算子と優先順位

まず、<=> と言う演算子は数値のみに使えます。

index.cgid: Argument "481_1" isn't numeric in sort at line 100

index.cgid: Argument "154_3" isn't numeric in sort at line 100

と言うエラーは該当文字列が数値変換できないために発生します。


valueでidをソートしたい

コードを見る限りでは value と id でソートと見えます。

素直に以下のようにやるのが簡単です。

# idとvalueがセットになったハッシュを複数作成する
my @hash_array = (
 { id => 1 , name => 'hoge' , value => 481 },
 { id => 3 , name => 'fuga' , value => 154 },
);

# value,id の順にソート
my @sorted_array = sort { $a->{value} <=> $b->{value} or $a->{id} <=> $b->{id} } @hash_array;

# 出力
use Data::Dumper;
print Dumper \@sorted_array;
◎質問者からの返答

コメントありがとうございます。

早速教えていただいたやり方を試してみます。


「valueでidをソートしたい」


ここのところは、valueをハッシュのキーにすると重複する可能性があるため、value+idにすることで重複を避けられるんじゃないかと思ってこのようにしました。後ろのidはユニークにするための物で意図としては、valueでソートしたいというものです。


ということでまずはやってみます。

関連質問


●質問をもっと探す●



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