use strict; use warnings;
use Data::Dumper;
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" },
);
my %found;
my @unique;
for my $grp (@test_data) {
my $t1=$grp->{Tag1}//'';
my $t2=$grp->{Tag2}//'';
next if ($found{$t1}{$t2});
push @unique,$grp;
$found{$t1}{$t2}=1;
}
print Dumper \@unique;
as it saves the cost of serializing and the cost of repeated storage of the characters Tag1/Tag2 at the expense of only checking the two keys AND representing the undefined key value as a zero length character scalar.
$VAR1 = [
{
'Tag1' => '1',
'Tag2' => 'a'
},
{
'Tag2' => 'b',
'Tag1' => '1'
},
{
'Tag1' => '1',
'Tag2' => 'c'
},
{
'Tag1' => '2',
'Tag2' => 'a'
},
{
'Tag2' => 'd',
'Tag1' => '2'
},
{
'Tag1' => '3'
},
{
'Tag1' => 'sun',
'Tag2' => 'a'
}
];
|