sub is_contained ($$$) { my ( $some_legal_range, $gene_legal_range, $legal_length ) = @_; ### save result for later use: my $range_length = legal_range_length($some_legal_range) or return 0; # if ( legal_range_length($some_legal_range) == 0 ) { # return 0; # } my $intersection_legal_range = intersect_legal_ranges( $some_legal_range, $gene_legal_range, $legal_length ); return ( legal_range_length($intersection_legal_range) == $range_length ); # if ( legal_range_length($intersection_legal_range) == # legal_range_length($some_legal_range) ) ### <- already did this call # { # return 1; # } # return 0; } # ... sub intersect_legal_ranges($$$) { my ( $legal_range_1, $legal_range_2, $legal_length ) = @_; my $intersections_a = []; my $intersect_h; ### let's declare this in advance for ( my $i = 0 ; $i < scalar( @{$legal_range_1} ) ; $i++ ) { for ( my $j = 0 ; $j < scalar( @{$legal_range_2} ) ; $j++ ) { $intersect_h = intersect_simple_ranges( ${$legal_range_1}[$i], ${$legal_range_2}[$j] ) and ### only push what you'll use push @{$intersections_a}, $intersect_h; } } $intersections_a = flatten_simple_ranges( $intersections_a, $legal_length ); } sub flatten_simple_ranges($$) { my ( $simple_range_a, $legal_length ) = @_; my $legal_range = []; my $last_to = undef; # # filter out undef # $simple_range_a = [ grep { $_ } @{$simple_range_a} ]; ### <- not needed ...