Многие цифры в вашем примере вывода не совпадают с вашим описанием того, что вы делаете, и числами в вашем образце ввода - вещи не складываются правильно, числа выходят за пределы диапазона и т. Д., Поэтомулибо ваш пример ввода, вывода или описание неверны, и я не уверен, какой.Кроме того, ваш пример кода не дает ничего похожего на ожидаемый выходной формат (который, как представляется, предназначен для каждого диапазона интервалов, имени, минимальной и максимальной глубины в этом диапазоне и суммы этого последнего столбца)...
Тем не менее, это делает то, что я думаю вы пытаетесь сделать:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use autodie;
# Read the depths file into a hash table to avoid re-reading it for
# every line of the intervals file.
my %depths;
open my $depth, "<", $ARGV[1];
while (<$depth>) {
chomp;
my @F = split /\t/;
push @{$depths{$F[0]}}, [ $F[1], $F[3] ];
}
open my $intervals, "<", $ARGV[0];
$, = "\t";
while (<$intervals>) {
chomp;
my @F = split /\t/;
my $sum = 0;
my ($min, $max);
for my $d (@{$depths{$F[0]}}) {
if ($d->[0] >= $F[1] && $d->[0] <= $F[2]) {
$sum += $d->[1];
$min = $d->[0] if !defined $min || $d->[0] < $min;
$max = $d->[0] if !defined $max || $d->[0] > $max;
}
}
say $F[0], $min, $max, $sum;
}
Обратите внимание на все, что упомянуто в комментариях zdim: более узкий охватпеременные (что приводит к тому, что предыдущие значения не сохраняются между новыми интервалами) и чтение файла глубины только один раз, а не один раз в строке файла интервалов, что делает его намного более эффективным.