#! /usr/bin/perl -w use strict; use Data::Dumper; my @lines = (<>); my %data = (); my $token = ''; foreach (@lines) { if (/\[(\w+)\]/) { $token = $1; } if (/(\w+)=(\w+)/) { $data{$token}->{$1} = $2; } } print Dumper(\%data); #### $VAR1 = { 'foo2' => { 'e' => '5', 'f' => '6', 'd' => '4' }, 'foo' => { 'a' => '1', 'b' => '2', 'c' => '3' } };