Прежде всего, было бы намного проще помочь вам, если бы вы
- использовали
strict
и warnings
и объявили все свои переменные близкими к первому использованию с my
- правильно отступил в ваш код, чтобы показать структуру
Причина, по которой ваш код дает сбой, заключается в том, что вы печатаете данные при слишком большом количестве условий.Например, вы выводите A1 16 24
, когда обнаруживаете, что его нельзя объединить с предыдущим диапазоном A1 4 14
, не дожидаясь его расширения на последующий A1 25 54
(когда вы правильно расширите диапазон и напечатаете его снова).A1 64 84
выводится дважды по той же причине: сначала потому, что его нельзя объединить с A1 25 54
, и снова, потому что он был "расширен" с A1 74 84
.Наконец, A2 15 20
выводится сразу, потому что у него есть новый первый столбец, хотя он объединяется со следующей строкой и выводится снова.
Вы должны вывести диапазон только тогда, когда обнаружите, что он не может бытьпродлен снова.Это происходит, когда
- обнаруживается новая запись, которая не перекрывает существующие данные
- достигнут конец файла
Этот код печатаетсявывод только в тех случаях, когда кажется, что делает то, что вам нужно.
use strict;
use warnings;
my @data;
while (<DATA>) {
if (not @data) {
@data = split;
next;
}
my @new = split;
if ($new[0] eq $data[0] and $new[1] <= $data[2] + 1) {
$data[2] = $new[2];
}
else {
print join("\t", @data), "\n";
@data = @new;
}
print join("\t", @data), "\n" if eof DATA;
}
__DATA__
A1 0 9
A1 4 14
A1 16 24
A1 25 54
A1 52 57
A1 59 62
A1 64 84
A1 74 84
A2 15 20
A2 19 50
ВЫХОД
A1 0 14
A1 16 57
A1 59 62
A1 64 84
A2 15 50