Hi,
I wanted to filter a hash. With rules like this:

1. For a hash with *keys sorted* by the second element.
2. Extract the string values (elem 4 to the end) of the hash into an array
3. If the current array is equivalent (same in size and content) with the one *just before*, ignore it.
4. Otherwise store them into a hash named 'filtered_hash'

Here is the code I attempted to write. But why it returns empty hash after filtering? How can I fix the problem?
#!/usr/bin/perl -w use strict; use Data::Dumper; use List::Compare; # The hash which I want to filter, which I manually 'ordered' # according to 2nd element of the array (184..etc), # for better visualization my %hash = ( 'GTGATCTTAGGACAAGGATAGAAATTAA' => ['1','184',7,'GACAAGG'], 'TGATCTTAGGACAAGGATAGAAATTAAG' => ['1','185',7,'GACAAGG'], 'GATCTTAGGACAAGGATAGAAATTAAGA' => ['1','186',7,'GACAAGG'], 'ACAAGGATAGAAATTAAGATGATCGTCA' => ['1','195',7,'ATCGTCA'], 'CAAGGATAGAAATTAAGATGATCGTCAT' => ['1','196',7,'ATCGTCA'], 'CAACATGCGATTACGATTACGAGTGGCG' => ['1','240',13,'GATTACG','GATTACG'], 'AACATGCGATTACGATTACGAGTGGCGC' => ['1','241',13,'GATTACG','GATTACG'], 'ATGCGATTACGATTACGAGTGGCGCTCG' => ['1','244',20,'GATTACG','GATTACG',' +GCGCTCG'], ); my %filtered_hash = filter(%hash); print Dumper \%filtered_hash; sub filter { my %hoa = @_; my %filtered_hoa; my @key = (sort {$hoa{$a}[1] <=> $hoa{$b}[1] } keys %hoa); foreach my $key (@key) { my @submt_only = @{$hoa{$key}}[3..$#{$hoa{$key}}]; my @flag = @submt_only; #Check if the current array is equiv. with *one* before my $lc = List::Compare->new(\@flag,\@submt_only); my $eq = $lc->is_LeqvlntR; if ($eq == 0 ) { #if they are not equivalent, assign them to a hash $filtered_hoa{$key} = $hoa{$key}; } else { #otherwise skip them next; } } return %filtered_hoa; }
My intended final result is:
my %filtered_hash = ( 'GTGATCTTAGGACAAGGATAGAAATTAA' => ['1','184',7,'GACAAGG'], 'ACAAGGATAGAAATTAAGATGATCGTCA' => ['1','195',7,'ATCGTCA'], 'CAACATGCGATTACGATTACGAGTGGCG' => ['1','240',13,'GATTACG','GATTACG'], 'ATGCGATTACGATTACGAGTGGCGCTCG' => ['1','244',20,'GATTACG','GATTACG',' +GCGCTCG'], );
Regards,
Edward

In reply to Filtering a Hash by monkfan

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.