use List::Util 'max'; my $selected = max grep { $find >= $_ } @array; #### # Find the largest number in @array # that is <= $find and put it in $selected my $selected; foreach my $number ( @array ) { $selected = $number if $find >= $number and $number > $selected; last if defined $selected and $selected == $find; }