sub binsearch(&$\@;$$) { my $compare = $_[0]; #my $value = $_[1]; my $array = $_[2]; my $min = $_[3] // 0; my $max = $_[4] // $#$array; my $min = 0; my $max = $#$array; return -1 if $max == -1; my $ap = do { no strict 'refs'; \*{caller().'::a'} }; local *$ap; my $bp = do { no strict 'refs'; \*{caller().'::b'} }; local *$bp; *$ap = \($_[1]); while ($min <= $max) { my $mid = int(($min+$max)/2); *$bp = \($array->[$mid]); my $cmp = $compare->() or return $mid; if ($cmp < 0) { $max = $mid - 1; } else { $min = $mid + 1; } } return _unsigned_to_signed(~$min); } sub _unsigned_to_signed { unpack('j', pack('J', $_[0])) }