Re-using a parser I have applied on PM several times now:
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 = <DATA>){
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} {CumulativeSuccessfullyEst
+ablished(calls)(In) 0} {CumulativeSuccessfullyCompleted(calls)(In) 0}
+ {CumulativeUnsuccessful(calls)(In) 0} }}} {{{Make Cal l} {{Cumulativ
+eActive(calls)(In) 0} {CumulativeSuccessfullyEstablished(calls)(In) 0
+} {CumulativeSuccessfullyCompleted(calls)(In) 0} {CumulativeUnsuccess
+ful(calls)(In) 0} }}} {{Initiating {{CumulativeA ctive(calls)(In) 0}
+{CumulativeSuccessfullyEstablished(calls)(In) 0} {CumulativeSuccessfu
+llyCompleted(calls)(In) 0} {CumulativeUnsuccessful(calls)(In) 0} }}}
+{{Summary {{CumulativeActive(calls)(In) 0} {CumulativeSuccessfullyEst
+ablished(calls)(In) 0} {CumulativeSuccessfullyCompleted(calls)(In) 0}
+ {CumulativeUnsuccessful(calls)(In) 0} }}}