in reply to finding intermediate range values from two file columns

As perldigious noted, your sample input and output don't make sense. I modified the input in the following way:
a 11-23 b 33-39 c 40-45 d 48-58
1-34 35-39 40-42 43-49 51-59 62-90

And got the following result:

a 11-23 b 33-34 b 35-39 c 40-42 c 43-45 d 48-49 d 51-58

from the following code:

#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use constant { FROM => 0, TO => 1, NAME => 2, }; my @ranges; open my $F1, '<', shift or die $!; while (<$F1>) { my ($name, $range) = split; my ($from, $to) = split /-/, $range; push @ranges, [$from, $to, $name]; } my $range_idx = 0; open my $F2, '<',shift or die $!; while (<$F2>) { chomp; my ($from, $to) = split /-/; my $end; do { ++$range_idx until $range_idx > $#ranges || $ranges[$range_idx][FROM] <= $to && $ranges[$range_idx][TO] >= $from; last if $range_idx > $#ranges; my $start = $from > $ranges[$range_idx][FROM] ? $from : $ranges[$range_idx][FROM]; $end = $to > $ranges[$range_idx][TO] ? $ranges[$range_idx][TO] : $to; say $ranges[$range_idx][NAME], " $start-$end"; } while $to > ($from = 1 + $end); }

Explanation: @ranges is an array of arrays, it stores the ranges from the first file. While processing the second file, you remember the last range(1) used ( $range_idx ) and for input ranges(2) spreading over more than one range(1), you adjust the $from and try again.

Joining the b's and c's left as an exercise for the reader :-)

($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,