use strict; use warnings; use Data::Dumper; my %tcl; my $ptr; my $threshold = 3; sub store_word { my ( $level, $word ) = @_; $word =~ s/^\s+//g; $word =~ s/\s+$//g; return "" unless $word; if( $level <= $threshold ) { $tcl{$word} = {} if not defined $tcl{$word}; $ptr = $tcl{$word}; } else { my ( $call, $value ) = split / /, $word; $ptr->{ $call } = $value; } return ""; } while(my $input = ){ my $level = 0; my $word = ""; my %action = ( '{' => sub { $word = store_word( $level++, $word ) }, '}' => sub { $word = store_word( $level--, $word ) }, 'default' => sub { $word .= shift }, ); ( $action{$_} // $action{'default'} )->($_) for $input =~ /./g; } print Dumper(\%tcl); print $tcl{'Make Cal l'}{'CumulativeSuccessfullyEstablished(calls)(In)'}, "\n"; __DATA__ {{Register {{CumulativeActive(calls)(In) 0} {CumulativeSuccessfullyEstablished(calls)(In) 0} {CumulativeSuccessfullyCompleted(calls)(In) 0} {CumulativeUnsuccessful(calls)(In) 0} }}} {{{Make Cal l} {{CumulativeActive(calls)(In) 0} {CumulativeSuccessfullyEstablished(calls)(In) 0} {CumulativeSuccessfullyCompleted(calls)(In) 0} {CumulativeUnsuccessful(calls)(In) 0} }}} {{Initiating {{CumulativeA ctive(calls)(In) 0} {CumulativeSuccessfullyEstablished(calls)(In) 0} {CumulativeSuccessfullyCompleted(calls)(In) 0} {CumulativeUnsuccessful(calls)(In) 0} }}} {{Summary {{CumulativeActive(calls)(In) 0} {CumulativeSuccessfullyEstablished(calls)(In) 0} {CumulativeSuccessfullyCompleted(calls)(In) 0} {CumulativeUnsuccessful(calls)(In) 0} }}}