相同的哈希键,不同的值:我如何比较它们?

Same hash keys, different value: how can I compare them?

我想比较哈希图中相同键的值。我想比较并获取同一密钥的最新日期。它 returns 出现在哈希图中的最后一个日期。我想比较并获取最新日期,即使它出现在哈希图中的第一个。 当同一个键在哈希图中第二次出现时,我很难将键出现时的第二个日期与第一个日期进行比较。

这是我的代码:

use strict;
use warnings;
my %hash = ( 48487 => '05/05/19', 
             52327 => '05/05/23', 
               123 => '06/01/01',
             52327 => '07/08/24',
               123 => '07/08/02',
             44147 => '24/12/18',
             48487 => '05/05/18',
             44147 => '24/12/19',
             64998 => '05/11/25',
             52327 => '05/06/24',
             64998 => '05/05/24' );
                    
foreach ( sort { $hash{$a} cmp $hash{$b} } keys %hash) {
    print "Date:$hash{$_}\tKey:$_\n";
}

您认为您的哈希有 11 key/value 对,但它只有 5 对。您可以通过以下方式向自己证明这一点:use Data::Dumper; print Dumper(\%hash);

您可以使用 Hash-of-Arrays data structure instead, then use Time::Piece 来比较您的 2 个日期。 Time::Piece 是一个核心模块,这意味着您不必安装它。

use warnings;
use strict;
use Time::Piece;

my %hash = (
    48487 => [qw(05/05/19 05/05/18)],
    52327 => [qw(05/05/23 07/08/24)],
      123 => [qw(06/01/01 07/08/02)],
);

for my $k (keys %hash) {
    my $d1 = Time::Piece->strptime($hash{$k}[0], '%d/%m/%y');
    my $d2 = Time::Piece->strptime($hash{$k}[1], '%d/%m/%y');
    if ($d1 > $d2) {
        print "$k $hash{$k}[0]\n";
    }
    else {
        print "$k $hash{$k}[1]\n";
    }
}

这会打印:

48487 05/05/19
52327 07/08/24
123 07/08/02

注意:为了简单起见,我只发布了您的 5 个唯一密钥中的 3 个。