use Data::Dumper; use strict; open (FILE, "filename"); my $menu_counter = 0; my $MenuName; my $MenuTitle; my %temp_hash; my $line_read; my @MenuList; #Array of Hashes while () { next if /^\s*$/; if ( /^\[Add Menu]/../^\[Done]/) { $line_read = $_; if ( $line_read=~/^\s*(\w+)\s=\s(.*)/ ) { if ($1 eq "Name") { $MenuName = $2; } elsif ($1 eq "Title") { $MenuTitle = $2; } } } elsif ( /^\[Add Entry]/../^\[Done]/) { $line_read = $_; if ( $line_read=~/^\s*(\w+)\s=\s(.*)/ ) { if ( $1 eq "Action") { if ($menu_counter != 0) { push @MenuList, {%temp_hash}; } $menu_counter++; %temp_hash = &initialize_structure( $1, $2, $menu_counter, $MenuName, $MenuTitle ); } else { &createpair( $1, $2); } } } } push @MenuList, {%temp_hash}; print Dumper(\@MenuList); sub initialize_structure() { my ( $key, $value, $counter, $menuname, $menutitle) = @_; my %temp_var; %temp_var = ( Name => "", Title => "", Action => "", Text => "", Counter => "", ); $temp_var{$key} = $value; $temp_var{'Counter'} = $counter; $temp_var{'Name'} = $menuname; $temp_var{'Title'} = $menutitle; return %temp_var; }; # subroutine to populate rest of the data structure sub createpair() { my($key, $value) = @_; $temp_hash{$key} = $value; };