use warnings; use strict; my %data; while () { chomp; next unless /\S/; my ($k,$v) = /^\s*(\S+)\s+(.+?)\s*$/; push @{$data{$k}}, $v; } use Data::Dumper; print Dumper(\%data); __DATA__ 1 AAA 2 BBB 3 CCC 4 DDD 2 EEE #### $VAR1 = { '3' => [ 'CCC' ], '1' => [ 'AAA' ], '4' => [ 'DDD' ], '2' => [ 'BBB', 'EEE' ] };