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