use strict; my @array = qw(A0-7:123:C B8-15:456:D); my $check = 'A4:123:C'; _check_range(\@array, $check) and print "in range\n"; sub _check_range { my $arr = shift; my $check = shift; my $regex = qr{^([a-zA-Z]+)(\d+)(?:-(\d+))?:(\d+):(\w+)}; $check =~ /$regex/ or return; my %check = ( 'char1', $1, 'digit1', $2, 'digit2', $4 , 'char2', $5 ); for( @$arr ){ if( /$regex/ ){ if( $check{char1} eq $1 and $check{char2} eq $5 ){ if( $check{digit2} == $4 ){ $check{digit1} >= $2 and $check{digit1} <= $3 and return 1 } } } } }