my %hash; my $current_token = ''; $re_types = qr/(HEADER|TITLE|COMPND)/; while () { my ($token, $value ) = $_ =~ m/^$re_types\s+(.*)/; next unless $token; if ( $token eq $current_token ) { ${$hash{$token}}[-1] .= ' ' . $value; } else { $current_token = $token; push @{$hash{$token}}, $value; } } use Data::Dumper; print Dumper \%hash; __DATA__ blah