in reply to Comparing parts of 2 strings in an array and deleting one

You could also try

my %h1 = map { /^\w+\s+\w+\s+(\w+)/ ; ( $1, 1) } @list_one; push @list_one, grep { /^\w+\s+\w+\s+(\w+)/; ! exists $h1{$1} } @list_ +two;

This retains the the ordering to some extent. I extracted the names a bit differently, but not necessarily in a better way.