my $num = 5; sub get_latest { my ($year, $mon, $day) = @_; my @arr; if ($year && $mon && $day) { my $h = $d_dbd->{$year}->{$mon}->{$day}; @arr = keys(%$h); } elsif ($year && $mon) { my $h = $d_dbd->{$year}->{$mon}; for (sort {$a <=> $b} (values %$h)) { push(@arr, keys(%$_)); last if (scalar(@arr) > $num); } } elsif ($year) { my $h = $d_dbd->{$year}; for my $m (sort {$a <=> $b} (values %$h)) { for (sort {$a <=> $b} (values %$m)) { push(@arr, keys(%$_)); last if (scalar(@arr) > $num); } } } else { for my $y (keys %$d_dbd) { my $h = $d_dbd->{$y}; for my $m (sort {$a <=> $b} (values %$h)) { for (sort {$a <=> $b} (values %$m)) { push(@arr, keys(%$_)); last if (scalar(@arr) > $num); } } } } return extract(\@arr); } sub extract { my ($arr) = @_; my @p; my @arr = @$arr; if (scalar(@arr) > $num) { for (1..$num) { my $rand = int(rand(scalar(@arr))); push(@p, splice(@arr, $rand, 1)); } } else { @p = @arr; } return \@p; }