use strict; use warnings; use Data::Dumper; my ($key1, $key2, $val, %hash); while () { if (($key2, $val) = m/(\w+)\((.*)\)/) { if ($key2 =~ /^CAL/) { $key1 = $val; } else { $hash{$key1}{$key2} = $val; } } } print Dumper(\%hash); __DATA__ CALCON(test1) { TYPE(U8) FEATURE(DCOM) NAM(stmin) LABEL(Min seperation time between CFs) MIN(0) MAX(127) UNITS(ms) } CALCON(test2) { TYPE(U16) FEATURE(DCOM) NAM(dcomc_sestmr_timeout) LABEL(DCOM Session Timer Timeout) MIN(0) MAX(65535) UNITS(ms) }