Я не очень хорошо разбираюсь в языке Perl, но столкнулся с проблемой, которую не смог решить, даже после долгих поисков в Интернете. Вкратце, у меня есть такой хэш хэшей:
my %HoH = (
chr1 => { start => 30, end => 55, },
chr1 => { start => 18, end => 21, },
chr1 => { start => 30, end => 80, }
);
Я просто хотел бы найти способ отфильтровать его (я имею в виду получение нового хэша хэшей на выходе) для определенных значений. В частности, учитывая интервал, скажем, 40-60, я хочу новый хэш хэшей только с элементами, перекрывающими этот интервал.
другими словами, я хотел бы получить в качестве вывода:
my %HoH = (
chr1 => { start => 30, end => 55, },
chr1 => { start => 30, end => 80, }
);
В качестве первой попытки я подумал попробовать что-то вроде этого:
определить, а затем удалить все элементы с помощью "end" < 40
и: определить, а затем удалить все элементы с помощью "start" > 60
.
Итак, я только что попробовал:
grep { $HoH{$_}{"end"} < 40 } keys(%HoH);
delete $HoH{$_} for grep { $HoH{$_}{"end"} < 40} keys(%HoH);
Но сразу после первого из двух фильтров я нашел в выводе только последний элемент и вообще не понимаю, где ошибка:
hash size is 1
chr1: start=30 end=80
распечатано со следующим:
my $len = keys %HoH;
print "hash size is $len\n";
foreach my $chr ( keys %HoH ) {
print "$chr: ";
for my $position ( keys %{ $HoH{$chr} } ) {
print "$position=$HoH{$chr}{$position} ";
}
print "\n";
}
На этот раз это кажется мне довольно сложным, я был бы рад, если бы кто-нибудь из вас мог мне помочь.