I think you did a nice job on your script(!), and you've received great comments about it. I'm not too sure if the following addresses either efficiency or elegance, but it's another option:
use Modern::Perl; my @array = ( 0, 11, 23, 40, 52, 67 ); my $find = 27; my ( $before, $after ) = findValAlongArray( $find, @array ); if ( defined $before and $before == $after ) { say "Exact match $find."; } elsif ( defined $before ) { say "$find is between $before and $after."; } else { say "$find was not found along the array."; } sub findValAlongArray { my ( $find, @array ) = @_; return $find, $find if $find ~~ @array; @array = sort { $a <=> $b } @array; for ( my $i = 0 ; $i < $#array ; $i++ ) { return $array[$i], $array[ $i + 1 ] if $array[$i] < $find and $array[ $i + 1 ] > $find; } undef, undef; }
Output:
27 is between 23 and 40.
Hope this helps!
Update: Added exact matching using smart match.
In reply to Re: Improve my lookup script
by Kenosis
in thread Improve my lookup script
by jjap
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |