0

このハッシュを理解し、並べ替えで処理するには、本当に助けが必要です。

ハッシュは次のとおりです。

$VAR1 = {

    Key1:Key1_si => {

        'KeyA' => {
            Keya => 'abcd, defg',
            keyb => '1000',
            keyc =>  '80%',
            keyd =>  '2011.10.09',
            keye => '1234-UR-DDDD',
            keyf => 'rwh',
            keyg => '600',
            keyh => 'red',
            keyi => '900',
            keyj => '',
            keyk =>'int4678_tt',
        },

        'KeyB' => {

            Keya => 'abcd, defg',
            keyb => '2000',
            keyc =>  '100%',
            keyd =>  '2011.11.09',
            keye => '1234-UR-DDDD',
            keyf => 'rwh',
            keyg => '500',
            keyh => 'red',
            keyi => '400',
            keyj => '',
            keyk =>'int4678_tt',
        },
    },

};

質問: 値が変化する「keyc」に基づいて、このハッシュをソートしたいと考えています。だから、私は以下のように基づいてソートしたい:

Key1:Key1_si->KeyB->Keyc

Key1:Key1_si->KeyA->keyc

また、次のような残りの属性とともに、ソートされた値を含む出力が必要です。

印刷:

Key1:Key1_si KeyB Keya keyd Keyc keyf

Key1:Key1_si KeyA keya keyd Keyc keyf

上記のようにソートを実行するための perl のコードを誰かが手伝ってくれませんか。あなたの時間と努力に感謝します。

4

1 に答える 1

3

キーペアのリストを並べ替えたいので、キーペアのリストを作成することから始める必要があります。配列への参照は明白な答えです。これを理解したら、すべてが簡単です。

キーのリストの作成:

my @unsorted_keys;
for my $k1 (keys(%$VAR1)) {
   for my $k2 (keys(%{ $VAR1->{$k1} })) {
      push @unsorted_keys, [ $k1, $k2 ];
   }
}

それらのキーの並べ替え:

my @sorted_keys = sort {
   my ($a_k1, $a_k2) = @$a;
   my ($b_k1, $b_k2) = @$b;

   ( my $a_pc = $VAR1->{$a_k1}{$a_k2}{keyc} ) =~ s/%//;
   ( my $b_pc = $VAR1->{$b_k1}{$b_k2}{keyc} ) =~ s/%//;

   $a_pc <=> $b_pc
} @unsorted_keys;

ソートされたキーを反復処理します。

for (@sorted_keys) {
   my ($k1, $k2) = @$_;
   my $hash = $VAR1->{$k1}{$k2};
   ... do stuff with %$hash ...
}
于 2013-01-16T23:15:48.343 に答える