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をソートしたいと言うことなのですが、エラーが出ないようにするにはどうすればいいでしょうか?



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

回答の条件
  • 1人5回まで
  • 登録:2009/04/16 09:37:26
  • 終了:2009/04/17 21:47:46

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402009/04/16 10:05:27

ポイント70pt

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;
id:southgate_01

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

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


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


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


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

2009/04/16 11:12:49
  • id:b-wind
    > 後ろのidはユニークにするための物
    結果的には同じ事。
    順番はともかく、他の要素もソートの基準に入れておかないと value の値が同じ時に状況によって結果が順不同になりえる。
  • id:southgate_01
    southgate_01 2009/04/17 21:48:59
    すいません、お返事が遅くなりました。

    質問とは関係ないところで躓いて時間が掛かったのですが、無事やりたいことが出来ました。
    ありがとうございました。

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

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

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

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