use Data::Dumper; open(DATA, "<", "test.dat"); my $data = {}; while () { chomp; /(.*)::=(.*)/; if (!exists($data->{$1})) { $data->{$1} = []; } $data->{$1}[$#{$data->{$1}} + 1] = $2; } print Dumper($data);