ฉันไม่เชี่ยวชาญภาษา 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";
}
ครั้งนี้ดูเหมือนจะซับซ้อนสำหรับฉัน ฉันจะดีใจถ้ามีใครสักคนสามารถช่วยฉันได้บ้าง