Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 打印哈希中的最小值_Perl_Hash - Fatal编程技术网

Perl 打印哈希中的最小值

Perl 打印哈希中的最小值,perl,hash,Perl,Hash,我在完成一项简单任务时遇到问题。我有以下散列: %hash = ( personA => { 2017 => 1, 2018 => 2, }, personB => { 2015 => 4, 2013 => 28, 2014 => 1, . }, personC => { 2013 => 3, 2011 => 2, 2012 => 45

我在完成一项简单任务时遇到问题。我有以下散列:

%hash = (
personA => {
    2017   => 1,
    2018   => 2,
},
personB => {
    2015   => 4,
    2013   => 28,
    2014   => 1, .
},
personC => {
    2013   => 3,
    2011   => 2,
    2012   => 45,
},
);
我试图打印每个人的最早年份,例如:

2017年人物角色

个人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}};

环游人群。然后,取消对每个人的引用散列,以获得年份列表:

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

您可以避免使用任何模块,同时保持简单性

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]-按升序(默认情况下)对键进行排序,然后获取第一个键。

对于第二个排序,可能是
sort{$a$b}
。在这个精确的例子中,它不会改变任何东西(而且由于键看起来有点像最近的日期,它可能不会改变任何与这个程序可以运行的数据有关的东西),但是用字符串比较数字听起来不是一个好主意。