# How to binary search the ordered list in Perl

Want to binary search an ordered list. Can it be coded in Perl or someone points to a link to me?
For example,
list: (2, 100, 1000, 4001, 10001, ...)
Want to find the closest number from left in the list to 7000, which is 4001.
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
0
Commented:
Check the below code for Binary search.
This may be of use to you.

Source:
http://www.perlmonks.org/?node_id=503154
Check the link for more details.
``````sub BinSearch
{
my (\$target, \$cmp) = @_;
my @array = @{\$_[2]};

my \$posmin = 0;
my \$posmax = \$#array;

return -0.5 if &\$cmp (0, \@array, \$target) > 0;
return \$#array + 0.5 if &\$cmp (\$#array, \@array, \$target) < 0;

while (1)
{
my \$mid = int ((\$posmin + \$posmax) / 2);
my \$result = &\$cmp (\$mid, \@array, \$target);

if (\$result < 0)
{
\$posmin = \$posmax, next if \$mid == \$posmin && \$posmax != \$posmin;
return \$mid + 0.5 if \$mid == \$posmin;
\$posmin = \$mid;
}
elsif (\$result > 0)
{
\$posmax = \$posmin, next if \$mid == \$posmax && \$posmax != \$posmin;
return \$mid - 0.5 if \$mid == \$posmax;
\$posmax = \$mid;
}
else
{
return \$mid;
}
}
}
``````
0

Experts Exchange Solution brought to you by