#!/usr/bin/perl use strict; use warnings; my @array = 1 .. 3_141_592; for (1 .. 400) { my $idx = bin_search(\@array, int(rand 3_141_592) + 1); } sub bin_search { my ($list, $tgt) = @_; return 0 if $tgt < $list->[0]; return $#$list if $tgt > $list->[-1]; my ($beg, $end, $val) = (0, $#$list, undef); while ($beg <= $end) { my $mid = int(($beg + $end) / 2); $val = $list->[$mid]; if ($val > $tgt) { $end = $mid - 1; } elsif ($val < $tgt) { $beg = $mid + 1; } else { return $mid; } } return -1; }