use strict; use warnings; use Data::Dumper; my %results = do { local $/ = ''; # paragraph mode map { /TYPE (\S+)/ => { 'cause' => (/CAUSE (\S+)/ ?$1:'UNDEF'), 'effect' => (/AFFECT (\S+)/?$1:'UNDEF'), } } ; }; print Dumper \%results; __DATA__ TYPE VALUE1 EQUALS MAIN CAUSE FAIL AFFECT ERROR ENDTYPE #### $VAR1 = { 'VALUE1' => { 'effect' => 'ERROR', 'cause' => 'ERROR' # instead of 'FAIL' } };