You try this,it will work.
use strict;
use warnings;
use Data::Dumper;
my @triples = ("chr1 9837 9840", "chr1 99998 99999", "chr2 9838 9840")
+;
my($start,$chrom,$stop,$avg);
foreach my $triple (@triples){
print "$triple :";
($chrom,$start,$stop)=split(/\s+/,$triple);
my @values=();
while ( defined(my $line=<DATA>) and !@values )
{
if ( $line =~ m/$chrom/)
{
@values=get_values();
if(@values)
{
average(\@values);
print "Average:",average(\@values),"\n
+" ;
}
}
}
print "Not Found:Average NA\n" unless (@values);
seek DATA,0,0;
}
sub get_values
{
my @values;
while ( defined(my $line=<DATA>) )
{
last unless $line =~ m/^\d/;
my ($tag,$value) = split(/\s+/,$line);
push (@values, $value) if ($tag >= $start and $tag <=
+$stop);
}
return @values
}
sub average
{
my ($array_ref) = @_;
my $sum;
my $count = scalar @$array_ref;
foreach (@$array_ref) { $sum += $_; }
return $sum / $count;
}
__DATA__
variableStep chrom=chr1
9837 0.010
9838 0.008
9839 0.007
9840 0.004
9841 0.002
9842 0.001
variableStep chrom=chr2
9837 0.090
9838 0.038
9839 0.017
9840 0.044
9841 0.052
9842 0.091