2017-01-19 7 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"; 
} 

Для мульти-ключа сортировки, сортировка работает просто отлично - при условии, что вещь это возвращает это числовое значение.

Таким образом, вы могли бы:

+0

Не знаю, я могу использовать срез с хэшем , Большое спасибо! – Sunella