删除散列中的过期条目,并仅保留一个最新的键值对

时间:2017-08-05 01:09:39

标签: perl

我有一个要求,我需要删除hashref中的旧条目。对于例如仅在以下数据部分" 2017/06/28"关键值对应该存活下来。 应删除所有键值对。请告诉我如何实现这一目标。

数据

$data_hashref = {
          '2017/06/27' => {
                            'start' => '13:07:00',
                            'end' => '23:47:00'
                          },
          '2017/06/15' => {
                            'start' => '07:11:00',
                            'end' => '00:18:00'
                          },
          '2017/06/28' => {
                            'end' => '06:37:00',
                            'start' => '00:06:00'
                          },
          '2017/06/17' => {
                            'start' => '09:17:00',
                            'end' => '10:17:00'
                          }
        };

RESULT

$data_hashref = {
          '2017/06/28' => {
                            'end' => '06:37:00',
                            'start' => '00:06:00'
                          }
        };

2 个答案:

答案 0 :(得分:1)

找到你想要保留的那个,并将其分配给哈希。

use List::Util qw( maxstr );

my $newest = maxstr keys %$href;

%$href = ( $newest => $href->{$newest} );

找到最新的密钥要比对所有密钥(O(N)对O(N log N))进行排序更有效,而且不再复杂。

答案 1 :(得分:0)

#!/usr/bin/perl
use strict;
use warnings;

my $href = {
          '2017/06/27' => {
                            'start' => '13:07:00',
                            'end' => '23:47:00'
                          },
          '2017/06/15' => {
                            'start' => '07:11:00',
                            'end' => '00:18:00'
                          },
          '2017/06/28' => {
                            'end' => '06:37:00',
                            'start' => '00:06:00'
                          },
          '2017/06/17' => {
                            'start' => '09:17:00',
                            'end' => '10:17:00'
                          }
};

my (undef, @keys) = sort {$b cmp $a} keys %$href;

delete @$href{ @keys };

use Data::Dumper; print Dumper $href;

更新:stevieb对此帖的评论是正确的。我会试着解释一下我做了什么。

日期格式从最大部分到最小部分(YYYY/MM/DD)。因此,它可以使用普通的ascii排序cmp进行排序。

从最新日期到最早日期排序。排序结果已分配给undef@keys。然后,最新日期将分配到undef,其余键(要删除)将分配给@keys

delete使用哈希切片@$href{ @keys }从哈希中删除所有早期日期及其值,只留下最新日期及其值,哈希引用。