note
choroba
No need for a hash, an array should be enough. Try the following:
<c>
#!/usr/bin/perl
use warnings;
use strict;
open my $GENES, '<', 'genes' or die $!;
open my $LOCATIONS, '<', 'locations' or die $!;
chomp(my @locations = map { (split ' ')[1] } <$LOCATIONS>);
# If IDs are not already sorted, uncomment the following line:
# @locations = sort { $a <=> $b } @locations;
for (<$GENES>) {
my ($chromosome, $start, $end) = split ' ';
print "$chromosome\t$start\t$end";
my $idx = 0; # For $end, start searching where you left for $start.
my $correction = 0; # Needed for Start(-) == Start and End(+) == End.
for my $pos ($start, $end) {
$idx++ while $locations[$idx] <= $pos - $correction
and $idx <= $#locations;
die "No numbers around $pos ($idx)\n"
if $idx == 0 or $idx > $#locations;
print "\t$locations[$idx-1]\t$locations[$idx]";
$correction = 1;
}
print "\n";
}
</c>
<b>Update: </b> Fixed border cases.
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-832495">
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
</div></div>
1020241
1020241