#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my (%HoAoH, $page, %H); while (){ chomp; if (/^Page/){ (undef, $page) = split /\s+=\s+/; } elsif (/^\[Start]/){ %H = (); } elsif (/^\[End]/){ push @{$HoAoH{$page}}, {%H}; } else{ my ($key, $value) = split /\s+=\s+/; # updated to produce output suitable for HTML::Template #if ($key eq 'varname'){ # $varname = $value; #} #elsif ($key eq 'varval'){ # push @AoH, {$varname => $value}; #} $H{$key} = $value; } } print Dumper(\%HoAoH); my @page2 = $HoAoH{'second page'}; __DATA__ Page = first page [Start] varname = name1 varval = val1 [End] [Start] varname = name2 varval = val2 [End] Page = second page [Start] varname = name11 varval = val11 [End] [Start] varname = name21 varval = val21 [End]