use strict; use warnings; use diagnostics; use Data::Dumper; # Generate primary data array my @data = map {[ split ]} ; print Dumper \@data; my $first = $data[0]; my @first_vs_x = map { [ "$first->[0] vs $data[$_][0]", # Generate new name entry $first->[1] - $data[$_][1], # Fred - X $first->[2] + $data[$_][2], # Fred + X ] } 1..$#data; # use indexes from 1 to last in @data print Dumper \@first_vs_x; __DATA__ Fred 15 20 Wilma 23 19 Barney 1 22 Betty 99 63