Это вариант отчета об отключении управления. Этот код, кажется, делает работу:
use strict;
use warnings;
my($prev) = -100;
my($grp0) = $prev;
my($col2, $col4);
sub print_group
{
my($grp0, $col2, $col3, $col4) = @_;
printf "seq %-5d %-4s %s %s\n", $grp0, $col2, $col3, $col4
if ($grp0 > 0);
}
while (<>)
{
chomp;
my @els = split(/\s+/,$_);
if ($els[3] ne "-")
{
print_group($grp0, $col2, "-", $col4);
print_group($els[1], $els[2], $els[3], $els[4]);
$prev = -100;
$grp0 = -100;
$col2 = "";
$col4 = "";
}
elsif ($els[1] == $prev + 1)
{
$grp0 = $prev if $grp0 < 0;
$prev = $els[1];
$col2 .= $els[2];
$col4 = $els[4];
}
else
{
print_group($grp0, $col2, "-", $col4);
$prev = $els[1];
$grp0 = $els[1];
$col2 = $els[2];
$col4 = $els[4];
}
}
print_group($grp0, $col2, $col4);
Пример вывода:
seq 75 T G -
seq 3185 A R +
seq 3382 A R +
seq 4923 CCT - +
seq 5252 A W +
seq 7400 T C -
seq 16710 C - -
seq 18248 T C -
seq 18962 CATA - +
seq 19566 A M +
Это более равномерный вывод, чем в предыдущем издании, но основная логика очень похожа на предыдущую. Выходные данные всегда генерируются одной и той же функцией, поэтому все максимально равномерно.
Может быть очень трудно получить правильные условия - потребовалось несколько (слишком много) итераций, чтобы получить этот код для получения ожидаемого результата.