use strict; use warnings; use Data::Dumper; open FH, "file", or die "Cannot open \$data $!"; my ( @headers, %hash, @arr ); while(){ chomp; if($.==1){ @arr=split /\s+/,$_; foreach(@arr){ $hash{$_}=[]; } } else{ my @temp=split /\s+/,$_; my $i=0; foreach(@temp){ push @{$hash{$arr[$i++]}},$_; } } } print Dumper \%hash;