I have to go run an errand, so I don't have time to analyze your code.

But to make things easier for others, I've re-indented it.

Once I get back, if no one else has figured this out, I'll take a look during the F1 race.

my %file1=(); while(<INPUT1>){ (my $id, my $number) = split("\t", $_); if ($id=~ m/^(CLS_S3_Contig[0-9]+)([-]?)([0-9]+)([_]?)([0-9]+)$/i) + { my $matched_id=$id; # breaks the CLS_Contig1000_200-202 to its + componenents for (my $i=$3-8;$i<$5+9;$i++){ push (@{$file1{$1}}, $i); # This makes a hash of names and + each position # plus/minus 8 - this is the has +h with each key # have multiple values. } }#end for if else {my $mismatch_id=$id; # print "$mismatch_id does not match with CLS_S3_Contigs!\n"; } # end for else } # end for while #reading the file 2 with several columns. columns 2, 5 make a hash of +multiple #value and $mismatch column is the one that need to meet the condition while(<INPUT2>){ my ($serial_no ,$contig_id, $position_with_gap, $gap, $position_corrected, $ATGCN, $depth, $consensus, $mismatch, $star, $geno_A, $geno_B) = split("\t", $_) +; push (@{$file2{$contig_id}}, $position_corrected); #Make a hash of + contig ID #and base posit +ion one key #multiple value +s push (@{$file2_2{$position_corrected}}, $mismatch); } #end for while # Here we are going to have access each element of hash of hash my $rHoH = foo();my %hash_1; my( $contig_id, $position_corrected, $mismatch ); for my $serial_no ( keys %$rHoH ) { $contig_id = $rHoH->{ $serial_no }->{ 'contigID' }; $position_corrected = $rHoH->{ $serial_no}->{ 'position_corrected' + }; $mismatch = $rHoH->{ $serial_no }->{ 'mismatch' }; # Now we want to know how many of contigs contain more than three mism +atch #Hash_1 here if ($mismatch >= 3) { #$hash_1{$contig_id} = $position_corrected; ## this will result a hash with name of contig and only one va +lue per contig # that is why it is commented here push (@{$hash_1{$contig_id}}, $position_corrected); # This mak +e a hash # with one + key with # multiple + values #print RESULTS "$contig_id\t$position_corrected\t$mismatch\n"; + # This prints all contige that have more than 3 mismatch. } } # here is where I messed up for the query. I cannot control this loop. # it finds the things but fails to print them only once. foreach $1 (sort keys %file1){ foreach my $position1 (@{$file1{$1}}){ $found =0; foreach $contig_id(sort keys %hash_1){ foreach my $position (@{$hash_1{$contig_id}}){ $found = 1 if $1 =~ /^$contig_id/ && $contig_id=~ /^$1 +/ && $position1==$position; print RESULTS "$position1\t$1\n" if $found; print "not matched\n" if !$found; } } } } ############################################################## sub foo { my ( $serial_no ,$contig_id, $position_with_gap, $gap, $position_corrected, $ATGCN, $depth, $consensus, $mismatch, $star, $geno_A, $geno_B); my %HoH = (); open(INPUT2,$ARGV[1]) || die "Cannot open file \"$ARGV[1]\""; # MA +P file while( <INPUT2> ) { ( $serial_no ,$contig_id, $position_with_gap, $gap, $position_ +corrected, $ATGCN, $depth, $consensus, $mismatch, $star, $geno_A, $gen +o_B) = split("\t", $_); $HoH{$serial_no} {'contigID'} = $contig_id; $HoH{$serial_no} {'position_corrected'} = $position_corrected; $HoH{$serial_no} {'mismatch'} = $mismatch; } return \%HoH; }

Mike

In reply to Re: Hash - Compare - Multiple value keys by RMGir
in thread Hash - Compare - Multiple value keys by sesemin

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.