use strict; use warnings; use Data::Dumper; my %table; my @header = split /\s+/, scalar( ); chomp $header[-1]; while ( my $line = ) { chomp $line; my @fields = split /\s+/, $line; for my $col ( $[ .. $#header ) { push @{ $table{$header[$col]} }, $fields[$col]; } } print Dumper \%table; __DATA__ A B C D 1 a 3 abc 4 b 4.5 xyz 3 2c 9 df