sub binsearch(&\@) { my ($compare, $array) = @_; my $i = 0; my $j = $#$array; return $j if $j == -1; for (;;) { my $k = int(($i+$j)/2); my $cmp; $cmp = $compare->() for $array->[$k]; return $k if !$cmp; if ($cmp < 0) { $j = $k-1; return _unsigned_to_signed(~$k) if $i > $j; } else { $i = $k+1; return _unsigned_to_signed(~$i) if $i > $j; } } } sub _unsigned_to_signed { unpack('j', pack('J', $_[0])) }