use Data::Dumper; my $line = qq( jvdsj 1234 gjrdkjpigkdj jkgpifodsjgi njhdaslj jhfdsalh Los Angeles, CA,91406 818-555-1212 wabbit\@acme.com); my %record = reverse split /<\/(\w+)>/, $line; foreach (keys %record) { $record{$_} =~ s/<[^>]+>//g; # remove start tags $record{$_} =~ s/^\s+//; # remove extra whitespace $record{$_} =~ s/\s+$//; delete $record{$_} unless $record{$_}; # kill the outermost record tag } print Dumper(\%record); PRINTS: $VAR1 = { 'reference1_name' => 'jvdsj', 'reference1_address' => '1234 gjrdkjpigkdj jkgpifodsjgi', 'reference1_title' => 'njhdaslj', 'reference1_company' => 'jhfdsalh', 'reference1_csz' => 'Los Angeles, CA,91406', 'reference1_phone' => '818-555-1212', 'reference1_email' => 'wabbit@acme.com' };