monkfan has asked for the wisdom of the Perl Monks concerning the following question:
My intended final result is:#!/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 %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'], );
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Filtering a Hash
by holli (Abbot) on Apr 12, 2005 at 07:18 UTC | |
|
Re: Filtering a Hash
by Hena (Friar) on Apr 12, 2005 at 07:44 UTC |