#!/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'], );