use strict; use warnings; use Data::Dumper; my $test_data = [ {'ID' => '1212', 'Name' => 'JOE' , 'Number' => 'XY1', 'CODE' => '6',}, {'ID' => '1212', 'Name' => '' , 'Number' => 'WW3', 'CODE' => '10',}, {'ID' => '4456', 'Name' => 'MARIA', 'Number' => 'TYX', 'CODE' => '6',}, {'ID' => '4456', 'Name' => '' , 'Number' => 'TYX', 'CODE' => '10',}, {'ID' => '8765', 'Name' => 'JEAN' , 'Number' => 'HPO', 'CODE' => '6',}, ]; my @result; foreach my $data ( @{ $test_data } ) { next if !$data->{Name}; my $id = $data->{ID}; push @result, $data; foreach my $temp ( @{ $test_data } ) { if (!$temp->{Name} and ($temp->{ID} eq $id)) { $result[-1]->{CODE} = $temp->{CODE}; last; } } } print Dumper(\@result);