my @candidate_files = obtain_candidates( ); ## File::Find::Rule, opendir/readdir, ... my %seen_files; my @to_delete; for my $file ( @candidate_files ) { ## regex out, use str2date, yadda yadda yadda my( $real_file, $date ) = parse_filename( $file ); if( not exists $seen_files{ $real_file } ) { $seen_files{ $real_file } = [ $file, $date ]; } else { my $prior_date = $seen_files{ $real_file }->[1]; if( $date - $prior_date > 0 ) { $seen_files{ $real_file } = [ $file, $date ]; } else { push @to_delete, $file; } } } process_deletions( @to_delete );