$ perl -Mstrict -Mwarnings -MData::Dumper -E ' > open my $tableFH, q{<}, \ < #CHROM POS ID REF ALT QUAL > chr1 1092344 . G T 79.54 > chr1 1092367 . C T 148.50 > chr1 1092400 . G C 90.54 > chr1 1092424 . A G 93.14 > chr1 1092461 . G A 105.30 > chr1 1092470 . T G 103.06 > chr1 1092482 . T C 104.33 > chr1 1093235 . G A 16.08 > chr1 1093245 . C T 244.75 > chr2 1347864 . T C 107.34 > chr2 1456284 . A C 86.32 > chr3 2031473 . G T 25.34 > chr3 2256801 . C T 154.65 > EOD > > my( undef, undef, @cols ) = map { split } scalar <$tableFH>; > my %chroms; > > while ( <$tableFH> ) > { > my( $chr, $pos, @vals ) = split; > @{ $chroms{ $chr }->{ $pos } }{ @cols } = @vals; > } > > print Data::Dumper->Dumpxs( [ \ %chroms ], [ qw{ *chroms } ] );' #### %chroms = ( 'chr3' => { '2031473' => { 'QUAL' => '25.34', 'ID' => '.', 'ALT' => 'T', 'REF' => 'G' }, '2256801' => { 'QUAL' => '154.65', 'ID' => '.', 'ALT' => 'T', 'REF' => 'C' } }, 'chr1' => { '1093245' => { 'QUAL' => '244.75', 'ID' => '.', 'ALT' => 'T', 'REF' => 'C' }, '1092344' => { 'QUAL' => '79.54', 'ID' => '.', 'ALT' => 'T', 'REF' => 'G' }, '1092461' => { 'QUAL' => '105.30', 'ID' => '.', 'ALT' => 'A', 'REF' => 'G' }, '1093235' => { 'QUAL' => '16.08', 'ID' => '.', 'ALT' => 'A', 'REF' => 'G' }, '1092367' => { 'QUAL' => '148.50', 'ID' => '.', 'ALT' => 'T', 'REF' => 'C' }, '1092424' => { 'QUAL' => '93.14', 'ID' => '.', 'ALT' => 'G', 'REF' => 'A' }, '1092470' => { 'QUAL' => '103.06', 'ID' => '.', 'ALT' => 'G', 'REF' => 'T' }, '1092400' => { 'QUAL' => '90.54', 'ID' => '.', 'ALT' => 'C', 'REF' => 'G' }, '1092482' => { 'QUAL' => '104.33', 'ID' => '.', 'ALT' => 'C', 'REF' => 'T' } }, 'chr2' => { '1456284' => { 'QUAL' => '86.32', 'ID' => '.', 'ALT' => 'C', 'REF' => 'A' }, '1347864' => { 'QUAL' => '107.34', 'ID' => '.', 'ALT' => 'C', 'REF' => 'T' } } );