for (@line) { $employee = GetElement($_); $groups{$employee->[name]} = $employee->[group]; push @list, $employee; } for (@list) { $_->[group] = $groups{$_->[manager]} unless $_->[group]; print ToCsv($_); } #### use Data::Dumper; my %people; while () { chomp; my ($name, $group, $manager) = split/,/; # Don't do that, use Text::CSV instead if ($group) { ${ $people{$name}{Group} } = $group; # Autovivification means: if the reference exists, change the value, else, create a new reference } else { $people{$name}{Group} = \${ $people{$manager}{Group} }; # Autovivification again } } print Dumper \%people; print ${ $people{"Woody Boyd"}{Group} }; __DATA__ Sam Malone,Cheers,Rebecca Howe Woody Boyd,,Rebecca Howe Rebecca Howe,Cheers,Rebecca's Manager