use strict; use warnings; my @labels = ('fee', 'fi', 'fo', 'fum'); open(my $fh, '<', "folks.txt") || die "can't open folks: $!"; my @list; while (<$fh>) { chomp; my @line = split /,/; my %hash = (number => shift @line); for my $i (0 .. $#labels) { $hash{$labels[$i]} = $line[$i]; } push @list, \%hash; } for my $label (@labels) { for my $element (@list) { print "$label,$element->{number},$element->{$label}\n" } }