#!/usr/bin/perl use Data::Alias; use Data::Dumper; use 5.01800; use warnings; use Data::Dumper; my $data =[ { Ad1 => '20 North Central St.', status => 'Main', City => 'NY', zCode => '0002', name => 'John D', ID => '2222', state => 'TO' }, { Ad1 => '15 South Street', status => 'Property', City => 'NY', zCode => '0002', name => 'John V', ID => '2222', state => 'TO' }, { Ad1 => '100 main St.', status => 'Extra', City => 'BO', zCode => '0007', name => 'Tony Star', ID => '2222', state => 'UA' }, { Ad1 => '5540 Chelsea Avenue', status => 'Cabin', City => 'NE', zCode => '4562', name => 'Carly Simon', ID => '2222', state => 'TO' }, { Ad1 => '12th Street', status => 'Main', City => 'NM', zCode => '2334', name => 'Charles D', ID => '1111', state => 'CA' }, { Ad1 => '44 Dell St', status => 'Extra', City => 'MA', zCode => '9857', name => 'Marie Doe', ID => '1111', state => 'CA' }, { Ad1 => '33 Dust Road', status => 'Property', City => 'ET', zCode => '3345', name => 'Chapim Thor',ID => '1111', state => 'CA' }, { Ad1 => '01 Charles St', status => 'Cabin', City => 'CA', zCode => '2334', name => 'Claud Odur', ID => '1111', state => 'CA' }, { Ad1 => '1AAAA', status => 'Main', City => 'AA', zCode => 'TTTT', name => 'AKAKAK', ID => '8888', state => 'PP' }, { Ad1 => '2AAAA', status => 'Test', City => 'BB', zCode => 'WWWW', name => 'BXBXBX', ID => '8888', state => 'HH' }, { Ad1 => 'CCCCC', status => 'Property', City => 'ET', zCode => '3345', name => 'Chapim Thor', ID => '8888', state => 'CA' }, { Ad1 => 'DDDDD', status => 'Cabin', City => 'CA', zCode => '2334', name => 'Claud Odur', ID => '8888', state => 'CA' }, ]; my $index={}; for (@$data) { if ($_->{status} eq 'Main') { $index->{$_->{ID}}{Main}=$_; } elsif ($_->{status} eq 'Extra') { $index->{$_->{ID}}{Extra}=$_; }; }; $Data::Dumper::Sortkeys=1; warn Data::Dumper->Dump([\$data,\$index],[qw(*data *index)]),' '; for my $key (keys %$index) { if (exists $index->{$key}{Main} && exists $index->{$key}{Extra}) { # We have a candidate for merging alias my $candidate=$index->{$key}; warn Data::Dumper->Dump([\$candidate],[qw(*candidate)]),' '; for my $item (keys %{$candidate->{Extra}}) { # next for items you don't want moved #next # if ($item =~ m{status}); $candidate->{Main}{"new_$item"}=delete $candidate->{Extra}{$item}; }; }; }; warn Data::Dumper->Dump([\$data],[qw(*data)]),' ';