删除哈希中过时的条目,并仅保留一个最新的键值对



我有一个要求,我需要删除哈希引用中的旧条目。例如,在下面的数据部分中,只有"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'
}
};

结果

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

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

use List::Util qw( maxstr );
my $newest = maxstr keys %$href;
%$href = ( $newest => $href->{$newest} );

查找最新键比对所有键进行排序(O(N( 与 O(N log N((更有效,而且没有更复杂的方法。

#!/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;

更新:史蒂夫对这篇文章的评论是正确的。我会试着解释我做了什么。

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

它从最新日期到最早日期排序。排序结果将分配给undef@keys。然后将最晚的日期分配给undef,其余的密钥(要删除(分配给@keys

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

最新更新