use strict; use warnings; use Data::Dumper; my %data; while () { my ($k, $v) = split; push @{ $data{$k} }, $v; } print Dumper(\%data); __DATA__ k1 5 k2 3 k1 7 #### $VAR1 = { 'k2' => [ '3' ], 'k1' => [ '5', '7' ] };