sub tpgSearch { my ($ref, $val, $min, $max) = @_; return undef if($max==$min); return $min if($$ref[$min]==$val); return $max if($$ref[$max]==$val); my $diff=($ids[$max]-$ids[$min])/($max-$min); my $pos=$min+int(($val-$ids[$min])/$diff); if($$ref[$pos]==$val) { return $pos; } else { if($$ref[$pos]<$val) { my $n_max=$pos+int(($val-$$ref[$pos])/$diff); $max=$n_max<@{$ref}?$n_max:@{$ref}; $min=$pos; if($min==$max) { $pos++ while($$ref[$pos]<$val); return $$ref[$pos]==$val?$pos:undef; } } if($$ref[$pos]>$val) { my $n_min=$pos-int(($$ref[$pos]-$val)/$diff); $min=$n_min>0?$n_min:0; $max=$pos; if($min==$max) { $pos-- while($$ref[$pos]>$val); return $$ref[$pos]==$val?$pos:undef; } } return tpgSearch($ref,$val,$min,$max); } }