use 5.018; use Data::Dumper; use JSON::XS; my @test_data = ( { Tag1 => "1", Tag2 => "a" }, { Tag1 => "1", Tag2 => "a" }, { Tag1 => "1", Tag2 => "b" }, { Tag1 => "1", Tag2 => "c" }, { Tag1 => "1", Tag2 => "a" }, { Tag1 => "2", Tag2 => "a" }, { Tag1 => "2", Tag2 => "d" }, { Tag1 => "2", Tag2 => "a" }, { Tag1 => "3"}, { Tag1 => "sun", Tag2 => "a" }, { Tag1 => "sun", Tag2 => "a" }, ); ## showing the hashrefs are different regardless of contents say qq{idx: $_\tref: $test_data[$_]} for 0..2; my $j = JSON::XS->new->pretty(0)->ascii(1)->canonical(1); my %seen_items; my @unique; for my $item ( @test_data ) { my $ser = $j->encode( $item ); push @unique, $item unless $seen_items{ $ser }++; } print Dumper \@unique; __END__ idx: 0 ref: HASH(0x7fb3ac003ee8) idx: 1 ref: HASH(0x7fb3ac015cf8) idx: 2 ref: HASH(0x7fb3ac015dd0) $VAR1 = [ { 'Tag1' => '1', 'Tag2' => 'a' }, { 'Tag2' => 'b', 'Tag1' => '1' }, { 'Tag1' => '1', 'Tag2' => 'c' }, { 'Tag1' => '2', 'Tag2' => 'a' }, { 'Tag1' => '2', 'Tag2' => 'd' }, { 'Tag1' => '3' }, { 'Tag1' => 'sun', 'Tag2' => 'a' } ];