in reply to How to get rid of dupes from an array of hashes

Assuming the keys and values can be uniquely stringified, and you can find a character(sequence) that isn't in your data (I've taken "#" here), you only need to go through the dataset once...

#!/usr/bin/perl -w use strict; use Data::Dumper; my @array = ( { a => 1, b => 2, c => 3}, { b => 1, d => 2, c => 3}, { a => 1, b => 2, c => 3}, { a => 2, b => 2, c => 3}, { a => 2, b => 1, c => 3}, ); my %count; my @unique; # eats away at @array, use for() if you want to keep it while (my $entry = shift @array) { # need to sort by something because an equivalent hash migh # return the key/value pairs in a different order my @sorted = map { $_, $entry->{$_} } sort keys %$entry; # create a unique string and see if we've seen it before next if $count{ join"#",@sorted }++; push @unique,$entry; } print Dumper(\@unique);

I'm not so sure how efficient this is with your data, though. Try it out. :-)

by the way: if your hashes are really the same objects (i.e. references to the same structure) you can just compare the stringified reference (ie. $href eq $href2). But considering your question, you're probably not in that situation.