2017-01-19 32 views
1

最近、Perlでネストされたデータ構造を試しています。私はハッシュの配列のハッシュを持っていると私はアルファベット順にキーでソートされた値を取得したいとしましょう。どうすればいいのですか?Perl:キーでソートされたネストされたハッシュの値を取得するにはどうすればよいですか?

コード:

#!/usr/bin/perl 
use JSON::XS; 
use Data::Dumper; 
#use diagnostics; 
use warnings; 

my $school_data = {'School' => '156', 'Pupils' => [{'Person' => {name => 'Alice', age => 10, pet => 'cat'},'id' => 56},{'Person' => {name => 'John', age => 9, pet => 'dog'},id => 4}]}; 

print "\$school_data:" . Dumper ($school_data); 

my $ref = $school_data->{Pupils}; 
foreach $pupil (@$ref){ 
    my @temp = sort (values $pupil->{'Person'}); 
    print "\[email protected]\n"; 
} 

は私に出力与える:

$school_data: $VAR1 = { 
       'School' => '156', 
       'Pupils' => [ 
          { 
           'id' => 56, 
           'Person' => { 
              'pet' => 'cat', 
              'name' => 'Alice', 
              'age' => 10 
              } 
          }, 
          { 
           'Person' => { 
              'age' => 9, 
              'name' => 'John', 
              'pet' => 'dog' 
              }, 
           'id' => 4 
          } 
          ] 
      }; 



10 Alice cat 

9 John dog 

をそして、私はアルファベット順にキーでソートされた値(ペットの名前、年齢)を取得したい:

探し
cat Alice 10 

dog John 9 

あなたの助けに送ってください。ありがとうございました。

+1

を?それとも特定のものだけ? – Sobrique

+2

['$ Data :: Dumper :: Sortkeys = 1'](https://metacpan.org/pod/Data::Dumper#Configuration-Variables-or-Methods) – mob

答えて

2

ハッシュを知っていると思いますが、並べ替えやキーと値のマッピングは一切保存しないでください。

しかし、sort関数は、ソート順を定義するためにポジションに依存する負の/ 0 /肯定を返す、かなり多くの任意のコードを取ることができます。

しかし、サブキーに基づいて「トップレベル」をソートする必要があります。

特定の順序で値を出力する必要がある場合 - ハッシュが順序付けられていないことを覚えておいてください。sliceを使用できます。

ので:マルチキーの並べ替えのために

#!/usr/bin/env perl 

use JSON::XS; 
use Data::Dumper; 

#use diagnostics; 
use strict; 
use warnings; 

my @things = qw (pet name age); 

my $school_data = { 
    'School' => '156', 
    'Pupils' => [ 
     { 'Person' => { name => 'Alice', age => 10, pet => 'cat' }, 
     'id'  => 56 
     }, 
     { 'Person' => { name => 'John', age => 9, pet => 'dog' }, id => 4 } 
    ] 
}; 

print "\$school_data:" . Dumper($school_data->{Pupils}); 

foreach my $pupil (sort { $_ -> {Person} -> {name} 
         cmp $_ -> {Person} -> {name} } 
           @{ $school_data->{Pupils} }) 
{ 
    print join " ", @{$pupil->{Person}}{@things}, "\n"; 
} 

、ソートだけで正常に動作 - それは返す事が数値で提供します。

だから、可能性:すべての3つのキーでソート

+0

ハッシュでスライスを使用できるかどうかわかりませんでした。どうもありがとう! – Sunella

関連する問題