#!/usr/bin/perl use warnings; use strict; my @data = map { my %h; @h{qw{ ID Name Number CODE }} = @$_; \%h } ['1212', 'JOE', 'XY1', '6'], ['1212', '', 'XY1', '10'], ['4456', 'MARIA', 'TYX', '6'], ['4456', '', 'TYX', '10'], ['8765', 'JEAN', 'HPO', '6']; my %name; for my $d (@data) { $name{ $d->{ID} } = $d->{Name} if length $d->{Name}; } my @new; my %used; for my $d (grep ! length $_->{Name}, @data) { push @new, { %$d, Name => $name{ $d->{ID} } }; undef $used{ $name{ $d->{ID} } }; } for my $d (@data) { push @new, $d if length $d->{Name} && ! exists $used{ $d->{Name} }; } use Data::Dumper; print Dumper \@new;