Saya tidak terlalu ahli dalam bahasa Perl tetapi saya mengalami masalah yang tidak dapat saya perbaiki, bahkan setelah melakukan penelitian panjang di web. Singkatnya, saya memiliki hash seperti ini:
my %HoH = (
chr1 => { start => 30, end => 55, },
chr1 => { start => 18, end => 21, },
chr1 => { start => 30, end => 80, }
);
Saya hanya ingin menemukan cara untuk memfilternya (maksud saya, mendapatkan hash baru dari hash dalam output) untuk nilai tertentu. Secara khusus, dengan interval, katakanlah 40-60, saya ingin hash hash baru dengan hanya elemen yang tumpang tindih dengan interval ini.
dengan kata lain saya ingin mendapatkan output:
my %HoH = (
chr1 => { start => 30, end => 55, },
chr1 => { start => 30, end => 80, }
);
Sebagai upaya pertama, saya berpikir untuk mencoba sesuatu seperti ini:
identifikasi lalu hapus semua elemen dengan "end" < 40
dan: identifikasi lalu hapus semua elemen dengan "start" > 60
.
Jadi saya baru saja mencoba:
grep { $HoH{$_}{"end"} < 40 } keys(%HoH);
delete $HoH{$_} for grep { $HoH{$_}{"end"} < 40} keys(%HoH);
Tetapi setelah filter pertama dari dua filter saya menemukan di output hanya elemen terakhir dan saya benar-benar tidak mengerti di mana kesalahannya:
hash size is 1
chr1: start=30 end=80
dicetak dengan yang berikut:
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";
}
Tampaknya cukup rumit bagi saya kali ini, saya akan senang jika ada di antara Anda yang dapat membantu saya.