use List::BinarySearch qw/ binsearch /; my @domain = ( 100 .. 1000 ); print "Target: ", $domain[ binsearch { comparator( $a, $b ) } 80, @domain ], "\n"; sub comparator { my( $low, $high ) = derive($b); return -1 if $a < $low; return 1 if $a > $high; return 0; } sub derive { my $raw = shift; my $low = $raw * .14; my $high = $raw * .19; return ( $low, $high ); } __END__ __OUTPUT__ 422