#! perl -slw use strict; sub bsearch { my( $aref, $value ) = @_; my( $lo, $hi, $mid ) = ( 0, $#{ $aref } ); while( $lo <= $hi ) { $mid = int( ($lo + $hi) / 2 ); if( $value > $aref->[ $mid ] ) { $lo = $mid + 1; } elsif( $value < $aref->[ $mid ] ) { $hi = $mid - 1; } else { #Found an exact match so return that index return $mid; } } # Didn't find an exact match so return the index below where we stopped # Or if the value is lower than the # lowest element, return 0 return $aref->[ $mid ] > $value ? $mid - 1 : $mid; } my @array = 0 .. 100; my $iNearest = bsearch \@array, 31.5; print 31.5, ' : ', $iNearest, ' : ',$array[ $iNearest ]; print "$_ => @{[ bsearch \@array, $_ ]}" for -1, 0, 1, 2, 31.1, 31.999, 50, 98, 99, 100, 101; __END__ P:\test>bsearch 31.5 : 31 : 31 -1 => 0 0 => 0 1 => 1 2 => 2 31.1 => 31 31.999 => 31 50 => 50 98 => 98 99 => 99 100 => 100 101 => 100