Эта программа делает, как вы просите. Он загружает все диапазоны в @pairs
(нет необходимости различать содержимое file1
и file2
) и копирует этот список в массив @unique
. Затем каждую возможную комбинацию из двух диапазонов тестируют, чтобы увидеть, перекрываются ли они, и оба диапазона удаляются с @unique
, если это так.
Оставшееся содержимое @unique
- это список диапазонов, который требуется. Я отобразил его, используя Data::Dump
, в случае, если вам нужно обработать результат дальше и с помощью print
, чтобы вы могли видеть, что результат соответствует требуемому результату в вашем вопросе.
use strict;
use warnings;
our @ARGV = qw/ file1.txt file2.txt /;
my @ranges;
while (<>) {
my @pair = /\d+/g;
next unless @pair == 2;
push @ranges, \@pair;
}
my @unique = @ranges;
for my $i (0 .. $#unique) {
for my $j ($i+1 .. $#unique) {
if ($unique[$i][0] <= $unique[$j][1] and $unique[$i][1] >= $unique[$j][0]) {
++$unique[$_][2] for $i, $j;
}
}
}
@unique = grep { not $_->[2] } @unique;
use Data::Dump;
dd \@unique;
print join(', ', map join('-', @$_), @unique), "\n";
выход
[[1, 3], [10, 12]]
1-3, 10-12
Обновление
Используя данные из @Choroba
(благодаря) на выходе теперь
[[1, 3], [1000, 1001], [10, 12]]
1-3, 1000-1001, 10-12
который я считаю правильным.
Вы меня спасете! Это прекрасно работает, спасибо! – Shikari
@Shikari: Подожди, есть ошибка, я работаю над исправлением! – choroba
@Shikari: Пожалуйста, тщательно протестируйте, теперь должно быть лучше. – choroba