in reply to search overlap paths
A recursive search does the trick so long as run time on typical data is not an issue:
use strict; use warnings; my @parts; while (<DATA>) { my ($start, $end) = /(\d+)\D(\d+)/; next if !defined $end; push @parts, [$start, $end]; } @parts = sort {$a->[0] <=> $b->[0] || $a->[1] <=> $b->[1]} @parts; print join ('-', @$_), "\n" for trailsBetween(0, 2000, @parts); sub trailsBetween { my ($prevEnd, $to, @parts) = @_; my @tails; return [$prevEnd] if $prevEnd == $to; while (@parts) { my ($start, $end) = @{shift @parts}; last if $start > $prevEnd; next if $end < $prevEnd; push @tails, trailsBetween($end, $to, @parts); } unshift @$_, $prevEnd for @tails; return @tails; } __DATA__ 0-200 0-1800 200-400 400-600 600-800 800-1000 1000-2000
Prints:
0-200-1800-2000 0-200-400-600-800-1000-2000 0-1800-2000
|
|---|