use strict; use warnings; use Data::Dumper; my $data; my $fsm = 1; my $m = ''; my $i = ''; while() { our $pointer; local *pointer; chomp; if (/^INSTANCE:\s+(\S+)/) { $m = ''; $i = $1; } elsif (/^MODULE:\s+(\S+)/) { $m = $1; $i = ''; } elsif (/^Fsm\s+(\S+)/) { next if !$fsm; if ($m) { *pointer = \$data->{'module'}->{$m}->{$1}; } else { *pointer = \$data->{'instance'}->{$i}->{$1}; } } elsif (/^State\s+(\S+)/) { next if !$fsm; push(@{ $pointer->{'state'} }, "$1"); print "A: " . Dumper( $pointer ); #DEBUG } elsif (/^Transition\s+(\S+)/) { next if !$fsm; push(@{ $pointer->{'transition'} }, "$1"); print "B: " . Dumper( $pointer ); #DEBUG } } print "C: " . Dumper($data); __DATA__ INSTANCE: i_name Fsm f_name State s_name1 # Transition t_name # State s_name2 #### A: $VAR1 = { 'state' => [ 's_name1' ] }; C: $VAR1 = { 'instance' => { 'i_name' => { 'f_name' => undef } } }; #### C: $VAR1 = { 'instance' => { 'i_name' => { 'f_name' => { 'state' => [ 's_name1' ] } } } }; #### C: $VAR1 = { 'instance' => { 'i_name' => { 'f_name' => { 'state' => [ 's_name1' 's_name2' ] } 'transition' => [ 't_name' ] } } } };