我有一个要求,我需要删除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'
}
};
答案 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 }
从哈希中删除所有早期日期及其值,只留下最新日期及其值,哈希引用。