вывести наименьшее значение в хэше хэшей (perl) - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок в Perl (и программировании в целом), и у меня возникают проблемы с выполнением простой задачи.У меня есть следующий хэш хэшей:

%hash = (
personA => {
    2017   => 1,
    2018   => 2,
},
personB => {
    2015   => 4,
    2013   => 28,
    2014   => 1, .
},
personC => {
    2013   => 3,
    2011   => 2,
    2012   => 45,
},
);

Я пытаюсь распечатать самый ранний год для каждого человека, например что-то вроде:

personA 2017

personB 2013

personC 2011

Кажется, что List :: Util - лучший инструмент для этого, но я не могу найти пример для адаптации к моим данным.У меня возникли проблемы, потому что решения, которые я нашел, пытаются отсортировать / напечатать первый уровень хэша (т.е. personA и т. Д.), А не годы.

use strict;
use warnings;

my %hash;
my $hash; 

%hash = (
personA => {
    2017   => 1,
    2018   => 2,
},
personB => {
    2015   => 4,
    2013   => 28,
    2014   => 1,
},
personC => {
    2013   => 3,
    2011   => 2,
    2012   => 45,
},
);

use List::Util qw(min);
my $min = min keys %hash;
$hash = {$min => $hash->{$min}};

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете вообще не использовать любой модуль, сохраняя простоту.

use warnings;
use strict;

my %hash = (
    personA => {
        2017 => 1,
        2018 => 2,
    },
    personB => {
        2015 => 4,
        2013 => 28,
        2014 => 1,
    },
    personC => {
        2013 => 3,
        2011 => 2,
        2012 => 45,
    },
);

foreach my $person ( sort keys %hash ) {
    printf( "%s %d\n", $person, ( sort keys %{ $hash{$person} } )[0] );
}

(ключи сортировки% {$ hash {$ person}}) [0] - сортируетключи в порядке возрастания (который по умолчанию), а затем получить первый.

0 голосов
/ 18 сентября 2018

Цикл по людям.Затем разыменуйте каждый хэш, чтобы получить список лет:

use warnings;
use strict;
use List::Util qw(min);

my %people = (
personA => {
    2017   => 1,
    2018   => 2,
},
personB => {
    2015   => 4,
    2013   => 28,
    2014   => 1,
},
personC => {
    2013   => 3,
    2011   => 2,
    2012   => 45,
},
);

for my $person (sort keys %people) {
    my $min = min(keys %{ $people{$person} });
    print "$person $min\n";
}

Выходы:

personA 2017
personB 2013
personC 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...