Perl 删除散列中过时的条目,只保留一个最新的键值对
我需要删除hashref中的旧条目。例如,在以下数据部分中,只有“2017/06/28”键值对应保留。 Rest应删除所有键值对。请为我提供如何实现这一目标的想法 数据Perl 删除散列中过时的条目,只保留一个最新的键值对,perl,Perl,我需要删除hashref中的旧条目。例如,在以下数据部分中,只有“2017/06/28”键值对应保留。 Rest应删除所有键值对。请为我提供如何实现这一目标的想法 数据 $data_hashref = { '2017/06/27' => { 'start' => '13:07:00', 'end' => '23:47:00'
$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'
}
};
更新:stevieb对这篇文章的评论是正确的。我会尽力解释我做了什么
日期格式从最大部分到最小部分(YYYY/MM/DD
)。因此,可以使用普通的ascii排序,cmp
它从最晚日期到最早日期排序。排序结果被分配给undef
和@keys
。然后,最新日期将分配给undef
,其余钥匙(要删除)将分配给@keys
delete
使用散列切片@$href{@keys}
从散列中删除所有较早的日期及其值,只留下最新日期及其值作为散列引用。只需找到要保留的日期,并将其分配给散列即可
use List::Util qw( maxstr );
my $newest = maxstr keys %$href;
%$href = ( $newest => $href->{$newest} );
查找最新的密钥比对所有密钥进行排序(O(N)vs O(N log N))更有效一些,而且不会更复杂。我不认为回答OP没有投入任何精力的问题是有帮助的,尤其是当您根本没有弄清楚代码的作用时。本质上,这个代码唯一的答案并没有向OP或者未来的读者解释任何事情。你用了什么代码来解决这个问题?因此,这不是一个代码编写服务,也不应该被视为这样。它是针对特定的编程问题的,在这里,您可以显示您遇到问题的特定代码,并在此基础上获得帮助。
use List::Util qw( maxstr );
my $newest = maxstr keys %$href;
%$href = ( $newest => $href->{$newest} );